2012-05-21 12 views
23

Estoy haciendo algunos pequeños experimentos basados ​​en this blog entry.¿Qué es "undefined x 1" en JavaScript?

Estoy haciendo esta investigación en el depurador de Google Chrome y aquí viene la parte difícil.

What the heck is this?!

recibo el hecho de que no puedo borrar variables locales (ya que no son los atributos del objeto). Entiendo que puedo 'leer' todos los parámetros pasados ​​a una función desde la matriz llamada 'argumentos'. Incluso lo entiendo que no puedo eliminar y el elemento de la matriz, solo logro tener array[0] tienen un valor de indefinido.

¿Alguien puede explicarme qué undefined x 1 significa en la imagen incrustada?

Y cuando sobrescribir la función foo para devolver el arguments[0], cuando me siento lo habitual y 'normal' sin definir.

Esto es solo un experimento, pero parece interesante, ¿alguien sabe a qué se refieren undefined x 1?

+1

Técnicamente, no estamos tratando con un 'Array' pero con una array-like 'Object'. – alex

+1

Tenga en cuenta que 'arguments' no es una matriz, sino un objeto' Arguments' (aunque se ve y se comporta de forma similar). Además, eliminar elementos de una matriz no se hace con el operador 'delete'. – Bergi

+0

@alex: Sí, lo sé, por eso 'puedo' eliminar pero solo la referencia al valor, ¿no? De lo contrario, la longitud del conjunto sería más corta con uno. – benqus

Respuesta

37

Eso parece ser nueva forma de cromo de mostrar índices inicializar en arreglos (arrays y -como objetos):

> Array(100) 
[undefined × 100] 

que sin duda es mejor que la impresión [undefined, undefined, undefined,...] o como lo era antes.

Aunque, si solo hay un valor de undefined, podrían soltar el x 1.

+1

Oh, pensé que había metido las manos en una mierda que no debería haber ... = D Ok, gracias amigo , +1, aceptado! = D – benqus

+5

Bueno. Parece que solo funciona para * implícito * 'indefinido's, p. Ej. 'new Array (100)' lo invoca pero '[undefined, undefined]' no – alex

+2

@alex: Sí, en este caso los índices '0' y' 1' en realidad existen en la matriz. Cambié un poco la redacción de mi respuesta. –

-1

Me pasó a mí también. Abre lo mismo en otro navegador y saca/registra la matriz en la consola. Siempre y cuando funcione en crome y en firefox de la misma manera (al acceder a los elementos funciona bien incluso si la salida tiene el undefinedx1), considero que es un tipo de error en Chrome que no refresca algo internamente. De hecho, puede probarlo de esta manera:

  1. Estaba agregando elementos a una matriz y activando console.log() para registrar el elemento, para comprobar si no estaba definido o no. Todos fueron definidos.
  2. Después de presionar(), registré la matriz y parecía que, cuando esto ocurría, siempre era la última indefinida x 1 en Chrome.
  3. Luego traté de iniciar sesión más veces y también más tarde, pero con el mismo resultado.
  4. Sin embargo, cuando accedí (por el bien de la salida), el elemento por su índice, devolvió el valor correcto (gracioso).
  5. Después de eso registré nuevamente la matriz y decía que el último índice no estaba definido x 1 (¡el mismo al que accedí directamente con éxito!).
  6. Luego hice un bucle for en la matriz, el registro o el uso de cada elemento, todo se mostró bien.
  7. A continuación, otro inicio de sesión en la matriz, todavía con errores.

    El código que estoy usando originalmente tiene comprobaciones indefinidas y no se activaron, pero estaba viendo todos estos indefinidos en la consola y me estaba molestando (sin juego de palabras).

También vale la pena leer: Unitialized variables in an array when using only Array.push? estoy usando pop() demasiado en mi código y es una explicación razonable de que el registro de la consola en realidad representa un estado diferente en el tiempo (cuando el código es 'detenida').

2

Google Chrome parece elegir mostrar sparse array usando esta notación undefined x n. Se mostrará [undefined, undefined] si no es una matriz dispersa:

var arr = new Array(2); 
console.log(arr); 

var arr2 = []; 
arr2[3] = 123; 
console.log(arr2); 

var arr3 = [,,,]; 
console.log(arr3) 

var arr4 = [,]; 
console.log(arr4) 

var arr5 = [undefined, undefined] 
console.log(arr5) 

var arr6 = [undefined] 
console.log(arr6) 

arr1 a arr4 son todas las matrices dispersas, mientras que ARR5 y arr6 no lo son. Chrome mostrará como:

[undefined × 2] 
[undefined × 3, 123] 
[undefined × 3] 
[undefined × 1] 
[undefined, undefined] 
[undefined] 

nota del [undefined x 1] para la matriz dispersa.

Desde que ha eliminado un elemento, se deduce que: If you delete an element from an array, the array becomes sparse.

1

Aquí es cómo se ve, escriba este código en la consola devtools cromo: -

arr = new Array(4); 
arr[2] = "adf"; 
console.log(arr); // [undefined × 2, "adf", undefined × 1] 

Véase el primer dos años consecutivos "indefinido" que están representados por * 2, para mostrar que hay dos indefinidos consecutivos allí

0

Las versiones más recientes de Chrome usan empty × en lugar de undefined × para hacer la diferencia un poco más clara.

Por ejemplo, al introducir [, undefined] en los resultados DevTools consola en:

▶(2) [empty × 1, undefined] 

y el examen de las llaves en:

▼(2) [empty × 1, undefined] 
    1: undefined 
    length: 2 
    ▶__proto__: Array(0) 
Cuestiones relacionadas