2011-09-17 7 views
6

En cuanto a este trozo de código:Javascript para el bucle con el objeto en lugar del contador?

for (var i = 0, f; f = families[i]; i++) { 
} 

En realidad no he visto un lazo como esto antes y quiero estar seguro de haber entendido correctamente.
¿Estoy en lo correcto al suponer que si families.length == 2 la segunda parte de la línea for devolverá falso en f = families[2]?

Hubiera pensado que tendría que ser algo así como f == families[2] para devolver falso.

+1

Me intriga, supongo que el bucle no se detendrá hasta un cierto criterio se cumple, no exactamente al procesar todas las entradas. – leopic

Respuesta

11

f = families[i] es una expresión que devuelve el valor de families[i]. (También tiene el efecto secundario de la asignación de ese valor a f)

Si families.length === 2 entonces families[2] === undefined de este modo la expresión devuelve undefined que es Falsey y rompe el bucle.

Para más diversión piratería puede activar

for (var i = 0, f; f = families[i]; i++) { 
    // body 
} 

en

for (var i = 0, f; f = families[i++]; /* body */); 

Puede que tenga que reemplazar la cadena ; con , y cadena de reemplazo i con i-1. También acaba de asesinar la legibilidad.

También se debe señalar que el bucle for es absurdo para la legibilidad.

Object.keys(families).forEach(function(key) { 
    var family = families[key]; 
    /* body */ 
}); 

Es significativamente más legible.

+2

* También acaba de asesinar legibilidad. * Je je. El coronel Mustard en el observatorio con el teclado. –

+0

De hecho, pero también según el comentario de LEOPiC, también es posible que un valor de falsey en algún lugar en el medio de la matriz haga que el ciclo se rompa, no siempre necesariamente cuando llega al final ... – Funka

+0

@Funka desde cuándo es una 'familia 'falsey;) – Raynos

0

Esto se ve como una especie de una manera tonta de hacer

for(var i in families) { 
    if (families.hasOwnProperty(i)) { 
     // do whatever you want with families[i] 
     console.log(families[i]); 
    } 
} 
+0

Use 'Object.keys' – Raynos

+0

Este método no tiene sentido para mí. ¿Por qué utilizar esto frente a un bucle for normal? Para mí, el ciclo que publiqué básicamente está sacando una línea de un bucle for donde diría algo como 'var family = families [i];' –

+0

Esto es diferente ... las familias podrían tener propiedades que no son 0 ..n, incluso si es "propio". –

Cuestiones relacionadas