2009-10-26 12 views
8

JSLint sigue quejándose de cosas como estaPara envolver en bucles con sentencias if en Javascript - bucle sobre matrices

var myArray = [1, 2, 3]; 
for (var value in myArray) 
{ 
    // BLAH 
} 

Decir que yo lo envuelve en una sentencia if. Me doy cuenta de que debe envolverlo si está pasando por encima de las propiedades de un objeto, pero aquí, ¿qué debo poner en la declaración if para hacer el filtrado correcto?

Además cuando hago algo así como

for (var i = 0; i < 10; i++) 
{ 
    // foo 
} 

for (var i =0; i < 20; i++) 
{ 
    // bar 
} 

Se queja de que ya se ha definido. ¿Cómo evito esto además de usar diferentes nombres de variable?

Respuesta

9

JSLint se queja de un lote que no es realmente dañino. En este caso, es correcto quejarse sobre for...in, porque esa es la construcción incorrecta para recorrer una matriz.

Esto se debe a que obtendrá no solo las teclas numéricas, sino también cualquier otra propiedad arbitraria que se haya agregado a la matriz o su Array.prototype. El último generalmente proviene de las funciones de utilidad de extensión agregadas por los marcos.

Si bien puede vencer esa caja con hasOwnProperty para comprobar que no es un miembro prototipo, es más feo que hacerlo de la manera correcta con for (var i= 0...), entonces ¿para qué molestarse?

Además, con for...in no necesariamente obtendrá los elementos en orden numérico como era de esperar.

Se queja de que ya he sido definido. ¿Cómo evito esto además de usar diferentes nombres de variable?

Sí, puede ignorar esa.

Quiere que elimine var del segundo for (i..., porque declarar una variable dos veces en el mismo ámbito no hace nada. Sin embargo, recomendaría dejar el var allí porque no hace ningún daño, y si mueve el lazo a otro bloque no querrá que de repente gane en globos globales.

8

Realmente, no tiene que escuchar jslint. Pero si realmente quiere sólo tiene que pasar (lo cual es bueno) que podría hacer:

var myArray = [1, 2, 3]; 
for (var value in myArray) 
{ 
    if (myArray.hasOwnProperty(value)) { 
    // BLAH 
    } 
} 

Para la segunda parte, que o bien tienen que ponerlos en funciones o utilizar diferentes variables. La otra solución sería simplemente usar i en lugar de var i la segunda vez, porque ya está definida ...

4

Si mira los documentos JSLint, encontrará un enlace que explica the rationale behind filtering for-in loops: básicamente, para evitar tropezar con cualquier propiedad enumerable que se haya agregado al prototipo del objeto. (Aunque no debe usar for-in para iterar sobre una matriz de todos modos.)

En el segundo caso declara la variable dos veces: las variables tienen alcance de función (o alcance global) en JavaScript.Douglas Crockford, y por lo tanto JSLint, sostiene que es mejor declarar la variable sólo una vez para el ámbito en el que reside:

var i; 

for (i = 0; i < 10; i++) 
{ 
    // foo 
} 

for (i =0; i < 20; i++) 
{ 
    // bar 
} 
0

sugiero seguir JSLint como buen punto de referencia, es posible que desee configurar algunas opciones y te hacen comprobar más flojo.

De todos modos la mejor manera de recorrer una matriz está utilizando para bucle en lugar de en bucle.

Si desea una explicación detallada, lea esto post

Cuestiones relacionadas