2012-08-04 49 views
8

Duplicar posible:
What is “undefined x 1” in JavaScript?¿Cuál es la diferencia entre [indefinido] y [,]?

En Chrome 21, la alimentación de [,] a las salidas de la consola

[sin definir x 1]

y alimentación [undefined] salidas

[Indefinido]

¿Cuál es la diferencia entre [undefined] y [undefined x 1]?

¿Cuál es la notación [undefined x 1]?

+4

creo, es necesario leer esta [link] (http://stackoverflow.com/questions/10683773/what-is-undefined-x-1-in-javascript) –

+0

'[] 'llega me '[]' ... – pimvdb

+2

La salida de la consola no es datos, y no es * (necesariamente) * notación o sintaxis de JavaScript. Es una representación visual de datos, ya que los desarrolladores de la consola decidieron que debería verse. A veces es útil, a veces puede ser confuso o engañoso. –

Respuesta

11

[,] es un sparse array. Tiene una longitud de 1, pero no hay valores (0 in [,] === false). También se puede escribir como new Array(1).

[undefined] es una matriz de longitud 1 con el valor undefined en el índice 0.

Al acceder a la propiedad "0", ambos devolverán undefined - el primero porque esa propiedad no está definida, el segundo porque el valor es "indefinido". Sin embargo, las matrices son diferentes, y también lo es su output in the console.

-1

Parece que es solo una forma abreviada de mostrar los valores repetidos "indefinidos". por ejemplo:

> [,,,] 
    [ undefined x 3 ] 

Pero [] no es lo mismo que [undefined] en absoluto. Lo comprobaría dos veces si fuera tú.

+0

Por favor, vuelva a leer mi pregunta. Estoy preguntando sobre '[,]', no '[]'. – Randomblue

+0

Explicación de la edición de pimvdb: http://es5.github.com/#x11.1.4, "Si se elimina un elemento al final de una matriz, ese elemento no contribuye a la longitud de la matriz". –

+0

@Randomblue, bueno, sí, desde que lo editó ...: - \ – nickf

0

Thats impares [] salidas solo [] nuevo para mí en Chrome 21.

De todos modos [a, b, c, ...] es la notación de matriz de Javascript por lo que, básicamente, está definiendo una matriz sin valores.

Sin embargo, una terminación , es aceptable para facilitar la generación de matrices. Entonces, lo que Chrome le dice es que hay un valor indefinido en la matriz. Vea el código para ejemplos.

[,,] 
> [undefined x2] 
[1,2,] 
> [1, 2] 
[1,2,,] 
> [1, 2, undefined × 1] 
[1,2,,,] 
> [1, 2, undefined × 2] 
[1,2,,3,4,,,6] 
> [1, 2, undefined × 1, 3, 4, undefined × 2, 6] 
+1

Los valores no están definidos porque no existen; no están configurados en 'undefined'. Y JavaScript puede manejar dichas matrices perfectamente bien. – pimvdb

+0

Cuál es la definición de indefinido. ¿Cuál es el problema exactamente? – dualed

+0

El problema es la redacción que no es muy precisa. He editado si no te importa. – pimvdb

5

[,] crea una matriz con una longitud de 1 y no hay índices.

[undefined] crea una matriz con longitud de 1 con undefined valor en el índice 0.

Chrome de undefined × x es para matrices dispersas que no tienen índices secuenciales:

var a = []; 

a[8] = void 0; //set the 8th index to undefined, this will make the array's length to be 9 as specified. The array is sparse 
console.log(a) //Logs undefined × 8, undefined, which means there are 8 missing indices and then a value `undefined` 

Si se va a utilizar .forEach en una matriz dispersa, se salta los índices que no existen.

a.forEach(function() { 
    console.log(true); //Only logs one true even though the array's length is 9 
}); 

Cuando, como si lo hace un bucle normal de .length basado:

for (var i = 0; i < a.length; ++i) { 
    console.log(true); //will of course log 9 times because it's only .length based 
} 

Hay una Gotcha si espera .forEach a comportan igual que las implementaciones no estándar.

new Array(50).forEach(function() { 
    //Not called, the array doesn't have any indices 
}); 

$.each(new Array(50), function() { 
    //Typical custom implementation calls this 50 times 
}); 
Cuestiones relacionadas