2012-03-30 208 views
5

世界上正在使第二個參數返回true爲什麼'for(;;)'循環?

警告:它會無限循環,並可能會崩潰瀏覽器

for(;;){ 
    //... 
} 

我完全期待不循環在所有...

但它正在運行,這會讓情況變得更糟,因爲只有在評估結果爲true時才能運行,或者我錯過了什麼?

+3

如果完全沒有條件,for循環會一直運行,直到你打破它爲止。這與C相同。 – 2012-03-30 03:21:10

+0

請參閱http://stackoverflow.com/questions/4894120/special-for-loop-syntax/4894256#4894256 - 在Java和JavaScript中與在C和C++中一樣。 – paxdiablo 2012-03-30 03:25:22

回答

7

forMDN

for ([initialization]; [condition]; [final-expression]) 
    statement 

[Initialization][final-expression]被直觀地不是必需的,減少了構建體對一個簡單的while循環。但相關的部分是:

條件
的表達式以每次循環迭代之前進行評估。如果此表達式的計算結果爲true,則執行語句。 此條件測試是可選的。如果省略,則條件始終爲真。如果表達式計算結果爲false,則執行跳到for結構之後的第一個表達式。

(重點煤礦)

這似乎是一個完全任意JS語言的設計決策。如果這是我的語言,我可能會引發語法錯誤。


在一個好玩側面說明,for(;;){}相當於while(true){},並且正好是4個字符短。我想知道是否縮小者利用這個!

+0

很好的參考,我完全信任該網站的每一個字 – ajax333221 2012-03-30 03:33:44

4

因爲條件的缺乏總是評估爲真。

+0

真的嗎?這是一種嗜好。它是如何在Java中無處不在的?正如'if()'中那樣? – 2012-03-30 03:23:39

+0

@RobertHarvey,語法防止'if()'沒有條件,但它不能阻止'for()'。 – rid 2012-03-30 03:25:46

1

沒有什麼「使第二個參數返回true」。沒有第二個參數。 ECMAScript Language Specification (ECMA-262 5th Edition)的12.6.3節說這個:

a。如果第一個表達式存在,則

i。假設testExprRef是評估第一個 表達式的結果。

ii。如果的GetValue(testExprRef)是,收益率(normalVempty)。

「第一表達」它指的是for語句的分號之間的可選表達式。如果存在,程序執行上面引用的步驟(i)和(ii)。如果該表達式不存在,則該程序根本不執行for語句算法的步驟(i)和(ii)。