objects - Al iterar sobre valores, ¿por qué typeof(value) devuelve "string" cuando value es un número? Javascript
ng repeat key value filter (1)
Estoy usando Google Chrome para esta prueba: al contrario de la intuición, el primer ciclo alerta "cadena" 3 veces, mientras que el segundo ciclo alerta "número" 3 veces.
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 ambos bucles alertaran al "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.
La razón por la que está viendo "cadena" en su primer ciclo es que num
hace referencia al índice de matriz , no al valor de numarray
en ese índice. Intenta cambiar tu primer ciclo para alertar num
lugar de typeof num
y verás que escupe 0, 1 y 2, que son los indicios y no los valores de tu 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 en lo que se refiere a typeof
.
Editar:
Como señala Matthew, no está garantizado que obtenga los elementos en la matriz en un orden particular cuando usa un ciclo for in
, y en parte por esa razón, no se recomienda iterar a través de las matrices de esa manera.
filip-fku pregunta cuándo sería útil usar for in
, dado 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
También vale la pena señalar que for in
bucles for in
también se recorrerán las propiedades de la cadena de prototipos del objeto. Por esa razón, generalmente es la forma en que le gustaría construir un bucle for in
:
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
// do something
}
}
Esto verifica si la propiedad fue definida por el objeto en sí y no un objeto heredado a través de la cadena de prototipos.