2011-01-19 9 views
10

Estaba explorando el Google Closure Compiler, y una cosa que noté fue que convierte while(true) en for(;;).Vacío para el bucle - para (;;)

Ambos cuelgan el navegador, pero ¿por qué el lazo vacío for no se rompe inmediatamente? La segunda parte está vacía y, por lo tanto, falsa. ¿No es cierto que cuando la segunda parte es faly, el ciclo for se detiene y la ejecución continúa con el código que viene después del ciclo for?

¿Podría alguien dar una explicación para esto?

+2

Quizás es más rápido ... alguien debería comparar ellos :) –

+2

Bueno, es más pequeña - eso es lo que hace el compilador: simplemente minifying su código (que es una gran herramienta realmente) – pimvdb

Respuesta

20

No, no es cierto.

Ver: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for

condición

Una expresión para ser evaluados antes de cada iteración del bucle. Si esta expresión se evalúa como verdadera, se ejecuta la instrucción . Esta prueba condicional es opcional. Si se omite , la condición siempre se evalúa como verdadera. Si la expresión se evalúa como falsa, la ejecución salta a la primera expresión que sigue al constructo .

Quizás debería dar un enlace a la referencia de ECMAScript, pero estoy bastante seguro de que dice más o menos lo mismo.

+4

Buena suerte. Acabo de leer las especificaciones [ECMA-262] (http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf) para bucles 'for' y generalmente son inescrutables. El comportamiento anterior es una consecuencia de seguir los pasos en la especificación, en lugar de estar explícitamente obligado por ella. – Phrogz

+0

Oh bien ... Entonces supongo que la referencia de Mozilla y mi palabra de que todas las variantes populares de ECMAScript se comportan de esta manera debe ser suficiente. : D – Mchl

1

Una parte central vacía se debe interpretar como true, por lo que no es falso. Tiene la misma semántica en C y en otros lenguajes con ese tipo de bucle (como C#, Java, etc.). Sería una verdadera trampa haberlo cambiado por JavaScript.

+1

No lo sabía. Además, no quiero que haya cambiado, solo me preguntaba. – pimvdb

+0

@pimvdb: lo entendí también :) Solo quería señalar que no dependía realmente del creador de JavaScript. Simplemente tenía que hacer lo que todos los demás estaban haciendo (o confundir a mucha gente). Pensándolo bien, supongo que confundió a la gente de todos modos, pero con otras partes del lenguaje: D – Jakob

4

Desde el ECMAScript language specification:

IterationStatement: for (ExpressionNoIn_opt; Expression_opt; Expression_opt) Declaración

Si la primera expresión está presente, entonces

  1. Let testExprRef ser el resultado de la evaluación de la primera Expresión.
  2. Si GetValue (testExprRef) es falso, devuelve (normal, V, vacío).

Como la primera expresión (el segundo argumento para) no está presente, esta sección nunca se ejecuta, por lo que el ciclo for no se cierra.

1

haya una evaluación algorothm por un bucle en el estándar ECMA-262 de la escritura que dice que sólo hay dos situaciones en las que bucle terminará:

  1. sentencia break
  2. valor de la declaración media igual a falsa , pero solo si esta declaración está presente en, por lo que no tiene que ser necesariamente valorado como verdadero (probablemente en motor mozilla js).