loop - recorrer objeto javascript
"Var" o no "var" en el bucle "for-in" de JavaScript? (9)
Creo que var es bueno por razones de rendimiento.
Javascript no buscará en todo el alcance global para ver si x ya existe en otro lugar.
¿Cuál es la forma correcta de escribir un bucle for-in
en JavaScript? El navegador no emite una queja sobre ninguno de los dos enfoques que muestro aquí. En primer lugar, existe este enfoque donde la variable de iteración x
se declara explícitamente:
for (var x in set) {
...
}
Y, alternativamente, este enfoque que se lee de forma más natural pero que no me parece correcto:
for (x in set) {
...
}
Deberías declarar las variables locales con var
, siempre .
Tampoco debería usar los bucles "for ... in" a menos que esté absolutamente seguro de que eso es lo que quiere hacer. Para iterar a través de arreglos reales (que es bastante común), siempre debe usar un bucle con un índice numérico:
for (var i = 0; i < array.length; ++i) {
var element = array[i];
// ...
}
Iterar a través de una matriz simple con "para ... en" puede tener consecuencias inesperadas, porque su ciclo puede recoger atributos de la matriz además de los indexados numéricamente.
editar - aquí en 2015 también está bien usar .forEach()
para iterar a través de una matriz:
array.forEach(function(arrayElement, index, array) {
// first parameter is an element of the array
// second parameter is the index of the element in the array
// third parameter is the array itself
...
});
El método .forEach()
está presente en el prototipo de matriz desde IE9 hacia adelante.
Desde un punto de vista general, la primera versión será para un índice que debe vivir dentro del alcance del bucle, mientras que la otra sería cualquier variable en el ámbito donde se invocó el constructor del bucle.
Si va a utilizar el índice de bucle dentro para el bucle y otros no lo necesitarán en las líneas siguientes, mejor declare la variable con "var", así que estará seguro de que "x" es para el índice del bucle inicializado con 0, mientras que el otro, si hay otra variable "x" disponible en este contexto, esto será sobreescrito por el índice de bucle, es decir, tendrá algunos errores lógicos.
En realidad, si no le gusta la declaración dentro for
encabezado, puede hacer:
var x;
for (x in set) {
...
}
Como se menciona en otras respuestas a esta pregunta, no usar var
genera efectos colaterales innecesarios, como la asignación de una propiedad global.
La primera versión:
for (var x in set) {
...
}
declara una variable local llamada x
. La segunda versión:
for (x in set) {
...
}
no.
Si x
ya es una variable local (es decir, tiene una var x;
o var x = ...;
algún lugar anterior de su ámbito actual (es decir, la función actual)), entonces serán equivalentes. Si x
no es ya una variable local, usar el segundo declarará implícitamente una variable global x
. Considera este código:
var obj1 = {hey: 10, there: 15};
var obj2 = {heli: 99, copter: 10};
function loop1() {
for (x in obj1) alert(x);
}
function loop2() {
for (x in obj2) {
loop1();
alert(x);
}
}
loop2();
puedes esperar que esto te heli
, hey
, heli
, hey
, there
, copter
, pero dado que el x
es uno y el mismo alertará, hey
, there
, there
, hey
, there
, there
. ¡No quieres eso! Use var x
en sus bucles for
.
Para colmo: si el bucle for
está en el ámbito global (es decir, no en una función), entonces el alcance local (el alcance x
se declara si usa var x
) es el mismo que el alcance global (el alcance x
se declara implícitamente en si usa x
sin var), por lo que las dos versiones serán idénticas.
Usar var
es la manera más limpia, pero ambas funcionan como se describe aquí: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in
Básicamente, al usar var
te aseguras de crear una nueva variable. De lo contrario, podría usar accidentalmente una variable previamente definida.
Use var
, reduce el alcance de la variable; de lo contrario, la variable busca el cierre más cercano buscando una sentencia var
. Si no puede encontrar una var
entonces es global (si está en un modo estricto, el using strict
variables using strict
y globales arroja un error). Esto puede generar problemas como los siguientes.
function f (){
for (i=0; i<5; i++);
}
var i = 2;
f ();
alert (i); //i == 5. i should be 2
Si escribe var i
en el ciclo for, la alerta muestra 2
.
Utilice el que declara la variable de bucle con var
. Las variables declaradas implícitamente tienen un alcance diferente que probablemente no sea el que pretendías.
for(var i = 0; ...)
es un patrón comúnmente visto, pero es diferente de
for(int i; ...)
en C ++ en que la variable no tiene un alcance para el bloque for
. De hecho, la var
se eleva a la parte superior del alcance envolvente (función) para que un local i
esté efectivamente disponible tanto antes del ciclo for
(después del comienzo del alcance / función actual) como después de él.
En otras palabras, hacer:
(function(){ //beginning of your current scope;
//...
for(var i in obj) { ... };
})();
es lo mismo que:
(function(){ //beginning of your current scope;
var i;
//...
for(i in obj) { ... };
})();
ES6 tiene la palabra clave let
(en lugar de var
) para limitar el alcance al bloque for.
Por supuesto, DEBE estar utilizando variables locales (las declaradas con var
o let
o const
(en ES6)) en lugar de variables globales implícitas.
for(i=0; ...)
o for(i in ...)
fallará si usa "use strict";
(como deberías) y i
no estoy declarado.