2010-11-23 14 views

Respuesta

10

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

+2

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. –

Cuestiones relacionadas