Encontré este código en línea y funciona; sin embargo, no puedo averiguar cómo!
¿Alguien puede explicar cómo funciona este código?
const arr_seq = Array.apply(null, { length: 10 }).map(Number.call, Number); console.log(arr_seq)La salida es:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Además, ¿alguien puede explicar por qué este código, que pensé que podría hacer exactamente lo mismo, crea una matriz llena de undefined ?
const arr_undef = Array(n).map(Number.call, Number);Array.apply espera un valor de matriz (-like) para su segundo argumento. Luego creará un argumento para cada ranura en este objeto similar a una matriz.
Dado que este código pasa { length: 5 } como argumento, el método de apply llamará a Array con 5 valores. Pero al leer { length: 5 }[i] for i en el rango 0..4, siempre quedará undefined . Entonces Array.apply(null, { length: 5 }) se traducirá a Array(undefined, undefined, undefined, undefined, undefined) .
Luego, la llamada .map tiene un segundo argumento, que es el argumento thisArg . Esto asegura que no solo se call a la llamada, sino Number.call , es decir, con this configuración correcta. Con Number.call el primer argumento recibirá esos valores undefined (explicados en el párrafo anterior) y como segundo argumento, el índice del mapeo. Entonces recibimos estas llamadas:
Number.call(undefined, 0) Number.call(undefined, 1) Number.call(undefined, 2) Number.call(undefined, 3) Number.call(undefined, 4)Esto da el mismo resultado que:
Number(0) Number(1) Number(2) Number(3) Number(4) Y .map devolverá una matriz con esos valores.
Desde ECMAScript 2015, JavaScript tiene Array.keys() y sintaxis extendida para literales de matriz. Entonces ahora podemos lograr lo mismo de una manera menos críptica:
console.log([...Array(5).keys()]);Array(n) crea una matriz vacía de longitud 10; la parte map / Number.call requiere que algo esté allí para obtener el índice:
const arr = Array(5).fill(null).map(Number.call, Number); console.log(arr);