2010-05-29 10 views
5

Estoy usando Google Chrome para esta prueba: Contrariamente a la intuición, el primer ciclo alerta "cadena" 3 veces, mientras que el segundo ciclo alerta "número" 3 veces.Al iterar sobre valores, ¿por qué typeof (value) devuelve "string" cuando value es un número? Javascript

numarray = [1, 2, 3]; 

//for-each loop 
for(num in numarray) 
    alert(typeof(num)); 

//standard loop 
for(i=0; i<numarray.length; i++) 
    alert(typeof(numarray[i])); 

Esperaba que los dos bucles alertaran "número" 3 veces. ¿Cómo se implementa el primer ciclo en Javascript? En otras palabras, si el for-each es azúcar sintáctico, ¿cuál es su equivalente al usar un ciclo estándar?

Además, ¿hay alguna forma de iterar sobre el espacio de nombres de un objeto utilizando un ciclo estándar? Estoy buscando tocar cada uno de los métodos y atributos de un objeto usando un bucle del segundo tipo. Soy nuevo en Javascript y cualquier ayuda es muy apreciada, gracias.

+0

También alerta 'cadena' en IE. – Senthil

+0

posible duplicado de [¿El índice de matriz de JavaScript es una cadena o un número entero?] (Http://stackoverflow.com/q/27537677/1048572) – Bergi

Respuesta

6

La razón por la que se está viendo "cadena" ha devuelto en el primer bucle es que num se refiere al índice de matriz , no el valor de numarray en ese índice. Intente cambiar su primer ciclo para alertar num en lugar de typeof num y verá que escupe 0, 1 y 2, que son las indices y no los valores de su matriz.

Cuando utiliza un bucle for in, está iterando sobre las propiedades de un objeto, que no es exactamente equivalente al bucle for en su segundo ejemplo. Las matrices en JavaScript son en realidad solo objetos con números secuenciales como nombres de propiedad. Se tratan como cadenas hasta typeof.

Editar:

Como Mateo señala, no se tiene la garantía de obtener los elementos de la matriz en un orden particular cuando se utiliza un bucle for in, y en parte por esa razón, no se recomienda para iterar a través de matrices de esa manera.

filip-fku pregunta cuándo sería útil usar for in, teniendo en cuenta este comportamiento. Un ejemplo es cuando los nombres de las propiedades en sí tienen un significado, que no es realmente el caso con las indices de matriz. Por ejemplo:

var myName = { 
    first: 'Jimmy', 
    last: 'Cuadra' 
}; 

for (var prop in myName) { 
    console.log(prop + ': ' + myName[prop]); 
} 

// prints: 
// first: Jimmy 
// last: Cuadra 

Es también digno de mención que for in bucles también iterar a través de las propiedades de la cadena de prototipo del objeto. Por esa razón, esto es por lo general la forma en que te gustaría construir un bucle for in:

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
    // do something 
    } 
} 

Esto una comprobación para ver si la propiedad se define por el objeto en sí mismo y no un objeto que está heredando de a través del prototipo cadena.

+2

No hay garantía de que los elementos de la matriz se visitarán en orden. Consulte [para ... en] (https://developer.mozilla.org/en/core_javascript_1.5_reference/Statements/for...in) en MDC: "iterar sobre una matriz no puede visitar elementos en orden numérico". Esta es la razón principal de ...in generalmente no se recomienda para matrices. –

+0

+1 @Jimmy: Gracias por la explicación. – Senthil

+0

¡Interesante! Diferente de lo que uno esperaría de C#/Java ... Pero, ¿cómo es esto mejor que escribir explícitamente el estándar para el ciclo, cuando todo lo que obtienes son los índices en lugar de los valores de la matriz en sí mismos? Es decir. ¿Por qué usarías esto cuando todos obtengan índices de todos modos? (Creo que puedo ver un uso para matrices asociativas). –

Cuestiones relacionadas