with uso metodo example diferencian javascript arrays

uso - metodo call en javascript



¿Por qué Array.apply(null,[args]) actúa de manera inconsistente cuando se trata de matrices dispersas? (2)

new Array(3) […] también puede reescribirse como [undefined, undefined, undefined]

No, como acaba de ver, el constructor de matrices crea matrices dispersas, por lo que debe reescribirse como [,,,] .

Si el término final de sparseArr no está definido

No Se está olvidando de comatas finales, que son opcionales desde EcmaScript 5. En realidad, [1] es simplemente equivalente a [1,] (ambos tienen una longitud de 1 ).

Para obtener "ranuras" dispersas, tendrá que agregar una coma adicional:

[] // empty array [,] // empty array [,,] // [undefined x 1] [,,,] // [undefined x 2]

Si sparseArr contiene un solo término, el denseArr resultante denseArr igual a [undefined x N]

Considera lo que significa llamar al método de apply :

Array.apply(null, [3,,4,1]) ≡ Array(3, undefined, 4, 1) Array.apply(null, [3,4]) ≡ Array(3, 4) Array.apply(null, [1]) ≡ Array(1)

Y sabe lo que hace el constructor de Array cuando se le llama con un solo argumento numérico: crea una matriz dispersa de esa longitud ...

Recientemente descubrí el siguiente fragmento de código en SO para ayudar a poblar rápidamente una matriz con valores predeterminados:

Array.apply(null, new Array(3)).map(function() {return 0;});

Dado el comportamiento del constructor Array y el método de aplicación, el fragmento de código anterior también se puede reescribir como tal:

Array.apply(null, [undefined, undefined, undefined]).map(function() {return 0;});

Esta técnica también es útil cuando se trata de matrices dispersas que desea rellenar con valores predeterminados:

var sparseArr = [3,,,4,1,,], denseArr = Array.apply(null, sparseArr).map(function(e) { return e === undefined ? 0 : e; }); // denseArr = [3,0,0,4,1,0]

Sin embargo es allí donde surgen dos rarezas:

  1. Si el término final de sparseArr no está definido, ese término no se asigna en denseArr
  2. Si sparseArr contiene un solo término (por ejemplo, sparseArr = [1] ) o un solo término seguido por un solo término indefinido (por ejemplo, sparseArr = [1,] ), el denseArr resultante denseArr igual a [undefined x 1]

¿Alguien puede explicar este comportamiento?


Puede tener una coma final en las matrices desde ECMA 262. Su presencia no modifica el contenido de la matriz de ninguna manera.

Si tiene dos o más comas consecutivas sin cola dentro de una matriz, su contenido se establece como no definido.

Nota: dado que undefined in arrays tiene un comportamiento no estándar en IE <9, evitaría usarlo allí. Utilice null lugar.

El hecho de que tenga resultados sorprendentes cuando sparseArr contiene un elemento se debe a que Array tiene dos constructores diferentes: si le pasa varios argumentos, crea una matriz con esa secuencia, si le pasa un solo número, crea una matriz de longitud "número" Lleno de indefinido.

new Array(1, 2, 3) => [1, 2, 3] new Array(2) => [undefined, undefined]