streakode

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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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.

Preguntas de entrevista de otras rutas

Ver todos los ejercicios de JavaScript / TypeScript