2010-02-12 20 views
8

¿Qué hace el siguiente javascript?Javascript - ¿Qué hace esta línea?

var groups = countrylist.split(',');  
for(var i = -1, group; group = groupsCounty[++i];){ 
    ... 
} 
+1

¿Se supone que 'groups' y' groupsCounty' son la misma variable? –

+0

Me encantaría saber: estoy tratando de averiguar qué está roto en la página: p – digiguru

+0

Eso está roto con seguridad. Cambie 'var groups = countrylist.split (',');' para 'var groupsCounty = countrylist.split (',');'. Probablemente alguien estaba refactorizando y renombrando esa variable, pero no terminó su trabajo. –

Respuesta

11
With i starting at -1 
increase i by 1 
get the ith element from the groupsCounty array 
if there is no such element: stop 
otherwise: assign it to group and carry on (with whatever "…" is) 

Es una versión optimizada de:

for (var i = 0; i < groupsCounty.length; i++;){ 
    var group = groupsCounty[i]; 
    … 
} 
+0

¿Es seguro hacer un bucle de esta manera? (¿Cómo funciona en todos los navegadores?) – digiguru

+0

¿El for-loop de la pregunta realmente supera al for-loop en esta respuesta? En la CPU o en la memoria utilizada? – jpabluz

+0

@David, ¿es eso correcto? group = groupsCounty [++ i] es un poco confuso para mí –

2

Está iterando sobre los elementos de grupos usando la presencia de un valor en grupo como condición de protección. es decir, usar JavaScript Truthiness para controlar el número de veces que el ciclo itera, porque guard será falso cuando no hay ningún valor que se le pueda asignar.

1

El for loop recorre el conjunto groups hasta que groupsCounty[++i] devuelve un valor falso.

Con el uso de los siguientes términos:

for (<initial-expression>; <condition>; <final-expression>) 

El inicial expresiónvar i = -1, group declara las variables i y group. Para cada iteración, la condición de buclegroup = groupsCounty[++i] asigna el siguiente valor de matriz a group. Si esa expresión es falsa (por ejemplo, groupsCounty[++i] devuelve undefined cuando está fuera de límites), el ciclo se detiene. Y la expresión final está vacía ya que i ya se ha incrementado dentro de la expresión contition.

-1

Es equivalente a

for (var group in groupsCounty) { 
    ... 
} 

Con el valor añadido de tener acceso al índice (i).

+0

'group' sería __be__ el valor del índice, entonces tendría que eliminar la referencia de la matriz usando' anotherVariable = groupdCountry [group] 'para adquirir el valor. – AnthonyWJones

+1

No es equivalente. Un bucle 'for ... in' enumera todas las propiedades del objeto, incluidas las propiedades heredadas del prototipo del objeto, en un orden indefinido. Por lo tanto, tiene un orden de bucle diferente y posiblemente se iterarán más propiedades. Además, en su ejemplo, 'group' sería el nombre de la propiedad en lugar del valor de la propiedad como lo es en la pregunta original. –

2

Su hacer esto: -

var groups = countrylist.split(',');  
for(var i = 0; i < groups.length; i++) 
{ 
    var group = groups[i] 
    ... 
} 

La única diferencia real es que lo anterior es mucho más común y más fácilmente reconocible. No habría publicado el código anterior preguntando "¿Qué está haciendo esto?".

El código que ha publicado es un ejemplo de desarrollo inteligente pero no necesariamente una buena práctica de codificación.