Mala práctica no es entender la diferencia entre enumerar sobre un objeto de matriz y iterando sobre él. De lo contrario, for...in
loop es una herramienta excelente. Hay gran diferencia interna, pero voy a tratar de explicar de la manera práctica:
sintaxis es: for (string in object)
, donde object
es una instancia de Object
(y, por supuesto, cualquiera de sus descendientes) y string
var recibe el nombre de propiedad de object
en cada iteración de bucle. ¡Pero Array
es un descendiente Object
también! Por lo tanto, es perfectamente legal para utilizar:
var array = [0,1,2];
for (var property in array)
alert(typeof property + '\t' + property + '\n' + typeof array[property] + '\t' + array[property]);
sino que simplemente no tiene sentido en absoluto. Además, tenga en cuenta la notación de paréntesis por encima de []
. Esta es una forma de operador de membresía y no debe confundirse con el acceso a elementos de matriz. Primero requiere un operando del tipo string
y el segundo - number
. Vamos a romper el ejemplo anterior y crear una matriz con var array = new Array(3)
en su lugar. El bucle ya no funciona, pero array.length == 3
correctamente.
Conclusión: utilice for...in
para cualquier objeto excepto matrices. Use for (var number = 0; number < array.length; number++)
con arreglos.
Por cierto, JavaScript objetos son similares a las matrices asociativas de PHP (hashtables, si insistes en el término adecuado). La sintaxis es var object = {string:value,anotherName:moreStuff}
. ¡Aquí for...in
es útil!
Further reading
Véase también el post de David Humphrey [interactuando sobre objetos en JavaScript rápidamente] (http://vocamus.net/dave/?p=1205) - para la variedad de que es mucho más lento. –