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, eldenseArr
resultantedenseArr
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:
- Si el término final de
sparseArr
no está definido, ese término no se asigna endenseArr
- 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,]
), eldenseArr
resultantedenseArr
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]