Preguntas de entrevista de JavaScript y TypeScript con respuestas
JavaScript se pregunta por su ámbito, su asincronía y su sistema de tipos, y TypeScript por lo que deja de comprobar en ejecución. Estas preguntas son de nivel 2, las que tienen trampa, y cada una trae su explicación.
Piensa la respuesta antes de abrirla: la explicación dice por qué fallan las demás opciones. En Streakode tienes 26 preguntas como estas de JavaScript / TypeScript, y un simulacro de 10 preguntas en 15 minutos, sin corrección hasta el final, para ver cómo irías en una entrevista de verdad.
12 preguntas de JavaScript / TypeScript
Temas: Ámbito · Arrays · Asincronía · Clases · Closures · Event loop · Números · Tipos · TypeScript.
1 · Encuentra el fallo · nivel 2
Imprime 3, 3, 3 en vez de 0, 1, 2. ¿Qué línea tiene el fallo?
1for (var i = 0; i < 3; i++) {2 setTimeout(() => console.log(i), 0);3}Ver la respuesta
El fallo está en la línea 1:
for (var i = 0; i < 3; i++) {var tiene ámbito de función: los tres callbacks comparten la misma i, que vale 3 cuando se ejecutan. Con let cada iteración tiene su propia variable.
2 · Elige la respuesta · nivel 2
¿Qué imprime este código?
const nums = [3, 1, 2];const sorted = nums.toSorted();console.log(nums.join(","), sorted.join(","));- A3,1,2 1,2,3
- B1,2,3 1,2,3
- C3,1,2 3,1,2
- DTypeError: nums.toSorted is not a function
Ver la respuesta
Respuesta: A. 3,1,2 1,2,3
toSorted() (ES2023) devuelve una copia ordenada y no toca el original, a diferencia de sort(), que ordena el array en su sitio.
3 · Elige la respuesta · nivel 2
¿Qué imprime este código?
console.log([NaN].includes(NaN), [NaN].indexOf(NaN));- Atrue -1
- Bfalse -1
- Ctrue 0
- Dfalse 0
Ver la respuesta
Respuesta: A. true -1
indexOf compara con ===, y NaN === NaN es false, así que no lo encuentra. includes usa SameValueZero, que sí considera iguales dos NaN.
4 · Elige la respuesta · nivel 2
¿Qué imprime este código?
const results = await Promise.allSettled([ Promise.resolve(1), Promise.reject(new Error("fallo")),]);console.log(results.map((r) => r.status).join(","));- Afulfilled,rejected
- Bfulfilled
- CError: fallo
- Dresolved,rejected
Ver la respuesta
Respuesta: A. fulfilled,rejected
allSettled espera a todas las promesas y nunca rechaza: devuelve un objeto por promesa con status fulfilled o rejected. Promise.all, en cambio, rechazaría con el primer error.
5 · Encuentra el fallo · nivel 2
Imprime "Todo guardado" antes de que terminen los guardados. ¿Qué línea tiene el fallo?
1async function saveAll(items) {2 items.forEach(async (item) => {3 await save(item);4 });5 console.log("Todo guardado");6}Ver la respuesta
El fallo está en la línea 2:
items.forEach(async (item) => {forEach no espera a las promesas que devuelve el callback. Hay que usar for (const item of items) { await save(item); } o await Promise.all(items.map(save)).
6 · Completa el hueco · nivel 2
Completa para que balance sea un campo privado de verdad. Una ficha se puede usar más de una vez.
class Account { ___balance = 0; deposit(amount) { this.___balance += amount; return this.#balance; }}console.log(new Account().deposit(50));- #
- _
- private
- @
- $
- static
Ver la respuesta
Respuesta: # · #
class Account { #balance = 0; deposit(amount) { this.#balance += amount; return this.#balance; }}console.log(new Account().deposit(50));Un campo que empieza por # es privado de verdad: fuera de la clase ni se puede leer ni aparece al recorrer el objeto. El guion bajo es solo una convención y private solo existe en TypeScript.
7 · Elige la respuesta · nivel 2
¿Qué imprime este código?
function makeCounter() { let count = 0; return () => ++count;}const a = makeCounter();const b = makeCounter();a();a();console.log(a(), b());- A3 1
- B3 3
- C1 1
- D2 1
Ver la respuesta
Respuesta: A. 3 1
Cada llamada a makeCounter crea su propia variable count, que la función devuelta recuerda. a lleva tres incrementos y b solo uno.
8 · Elige la respuesta · nivel 2
¿En qué orden se imprimen las letras?
console.log("A");setTimeout(() => console.log("B"), 0);Promise.resolve().then(() => console.log("C"));console.log("D");- AA D C B
- BA B C D
- CA D B C
- DA C D B
Ver la respuesta
Respuesta: A. A D C B
Primero se ejecuta el código síncrono (A, D). Después se vacía la cola de microtareas, donde está el then (C), y por último las tareas, donde está el setTimeout (B).
9 · Elige la respuesta · nivel 2
¿Qué imprime este código?
console.log(0.1 + 0.2 === 0.3, (0.1 + 0.2).toFixed(2));- Afalse 0.30
- Btrue 0.30
- Cfalse 0.3
- Dtrue 0.3
Ver la respuesta
Respuesta: A. false 0.30
0.1 y 0.2 no tienen representación exacta en binario y la suma da 0.30000000000000004. toFixed(2) redondea y devuelve un string con dos decimales. Con dinero, trabaja en céntimos enteros.
10 · Elige la respuesta · nivel 2
¿Qué imprime este código?
console.log(typeof null);- Aobject
- Bnull
- Cundefined
- DTypeError
Ver la respuesta
Respuesta: A. object
Es un error histórico del lenguaje que no se puede corregir sin romper la web: typeof null devuelve "object". Para comprobar null, compara con value === null.
11 · Elige la respuesta · nivel 2
¿Qué imprime este código?
enum Color { Red, Green, Blue }console.log(Color.Green, Color[2]);- A1 Blue
- BGreen Blue
- C1 2
- DGreen 2
Ver la respuesta
Respuesta: A. 1 Blue
Un enum numérico empieza en 0 y genera un mapeo en los dos sentidos: Color.Green es 1 y Color[2] es "Blue". Por eso muchos proyectos prefieren uniones de strings, que no generan código.
12 · Completa el hueco · nivel 2
Completa para distinguir entre un string y un array de strings.
function len(value: string | string[]) { if (___ value === "string") return value.length; return value.___;}console.log(len("hola"), len(["a", "b"]));- typeof
- length
- instanceof
- size
- keyof
- count
Ver la respuesta
Respuesta: typeof · length
function len(value: string | string[]) { if (typeof value === "string") return value.length; return value.length;}console.log(len("hola"), len(["a", "b"]));typeof devuelve el tipo en tiempo de ejecución como texto y TypeScript lo usa para estrechar el tipo dentro del if. keyof es un operador de tipos y no existe al ejecutar.