Vuoto per ciclo – per (;;)

Stavo esplorando il Google Closure Compiler e una cosa che ho notato è che converte while(true) in for(;;) .

Entrambi bloccano il browser, ma perché il ciclo for vuoto non si interrompe immediatamente da solo? La seconda parte è vuota, e quindi falsa. Non è vero che quando la seconda parte è falsa, il ciclo for interrompe e l’esecuzione continua con il codice che segue il ciclo for ?

Qualcuno potrebbe forse dare una spiegazione per questo?

No, non è vero.

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

condizione

Un’espressione da valutare prima di ogni iterazione del ciclo. Se questa espressione è true, viene eseguita un’istruzione. Questo test condizionale è facoltativo. Se omesso, la condizione viene sempre valutata come vera . Se l’espressione restituisce false, l’esecuzione salta alla prima espressione che segue il costrutto for.

Dovrei forse dare un link al riferimento ECMAScript, ma sono abbastanza sicuro che afferma più o meno la stessa cosa.

Dalla specifica del linguaggio ECMAScript :

IterationStatement: for (ExpressionNoIn_opt; Expression_opt; Expression_opt) Statement

Se la prima espressione è presente, allora

  1. Lascia che testExprRef sia il risultato della valutazione della prima espressione.
  2. Se GetValue (testExprRef) è falso, restituisce (normale, V, vuoto).

Poiché la prima espressione (il secondo argomento di for) non è presente, questa sezione non viene mai eseguita, quindi il ciclo for non esce.

Una parte centrale vuota dovrebbe essere interpretata come true , quindi non è falsa. Ha la stessa semantica in C e altre lingue con quel tipo di loop (come C #, Java e così via). Sarebbe una vera trappola averlo cambiato per JavaScript.

Esiste un algoritmo di valutazione di for loop nello script standard ECMA-262 che dice che ci sono solo due situazioni in cui il ciclo terminerà:

  1. dichiarazione di rottura
  2. valore di istruzione media uguale a false , ma solo se questa affermazione è presente , quindi non deve essere necessariamente valutata come vera (probabilmente nel mozilla js engine è).