Encontré un código JavaScript que crea una matriz y la llena con números del 0 al 9.
El código es:
var arr = Array.apply(null, {length: 10}).map(Number.call, Number); console.log(arr); El código anterior crea una matriz e inserta números del 0 al 9 en ella. No entiendo cómo está funcionando. Conozco todos los métodos que se usan en esto, como apply , map y call , pero aún no entiendo cómo funciona.
¿Alguien puede explicar el funcionamiento del código dividiéndolo en partes? Por ejemplo, cómo se ejecuta el código paso a paso y cómo da como resultado una matriz que tiene números del 0 al 9.
En primer lugar, su código crea una matriz de 10 elementos, todos los cuales no están undefined con el siguiente código:
Array.apply(null, {length: 10})Lo anterior es como escribir:
Array(undefined, undefined, undefined, undefined, ... 6 more times ...) Esto funciona porque el objeto {length: 10} es similar a una matriz ya que tiene una propiedad de length . Por lo general, el segundo argumento de .apply() es una matriz de argumentos con los que desea llamar a la función. Sin embargo, como está pasando un objeto en este caso, JS toma la propiedad de longitud y llama a la función Array() con 10 argumentos undefined , ya que las claves del objeto {length: 10} no definen valores para las propiedades 0 a 9
A continuación, se mapea la matriz de 10 valores undefined . Cuando se usa .map() , el primer argumento es la función de mapeo y el segundo argumento del método .map() es this argumento, this indica a qué debe referirse dentro de la primera función de mapeo. Una forma de ver su método de mapa es volver a escribirlo así:
.map((element, index, array) => Number.call(element, index, array)) El método .map() iterará a través de todos sus 10 elementos undefined , y para cada elemento se invocará su devolución de llamada con el index de ese elemento. Cuando se usa Number.call() , this para la llamada a la función Number() se establece en undefined (es decir: element ). Esto no afecta el comportamiento de la llamada a Number() ya que no depende de ningún valor en particular para su ejecución. Como resultado, el método Number.call anterior es lo mismo que usar Number(index, array) , donde se descarta la array , por lo que simplemente realiza Number(index) .
El segundo argumento del método .map() es definir el enlace this para la primera función de mapeo que pasa al método .map() . Cuando pasa Number.call como la función de mapeo, está pasando una referencia al método de call definido en Function.prototype.call . El método de call solo sabe qué función debe invocar en función de this valor definido al llamar al método .call() . Como solo le está pasando al método .map() una referencia a la función call() y no la está invocando con () , this se pierde, por lo que necesita definir explícitamente cuál es this valor. Eso se puede hacer pasando Number como el segundo argumento de su llamada al método de mapa.