從本質上說,我想申報while循環的條件部分的變量在javascript:聲明中,而條件變量在JavaScript
while (var b=a.pop()) {
do_sth(b)
}
然而,我的瀏覽器(Firefox)不接受。相反,我必須這樣走:
var b
while (b=a.pop()) {
do_sth(b)
}
哪些工作。預期這種行爲?
從本質上說,我想申報while循環的條件部分的變量在javascript:聲明中,而條件變量在JavaScript
while (var b=a.pop()) {
do_sth(b)
}
然而,我的瀏覽器(Firefox)不接受。相反,我必須這樣走:
var b
while (b=a.pop()) {
do_sth(b)
}
哪些工作。預期這種行爲?
是的。
如果你願意,你可以使用一個for
循環,就像這樣:
for (var b; b = a.pop();) { //Note the final semicolon
do_sth(b);
}
JavaScript沒有塊範圍。所以所有var
聲明都在函數範圍內。所以在while
表達式中聲明一個變量在JavaScript中沒有意義。
此外,你應該用分號結束你的語句。這不是絕對必要的,但強烈建議。
這個問題有點過時了,但我認爲答案都會錯過一個重要的區別。也就是說,while
循環期望表達式,其被蒸發爲條件的,即可以被轉換爲布爾值的布爾值或值。詳情請參閱Mozilla docs。
純賦值(無實例化)通過其默認返回值(右側的值)強制爲布爾值。
一個var
(或let
或const
)是聲明,允許一個可選的分配,但有undefined
返回值。單獨
var foo = 42; // undefined
bar = 42 // 42
返回值不回答這個問題,因爲undefined
是falsey,但也表明,即使JS讓你把一個var
在:
您可以在控制檯輕鬆地測試此有條件的,它總是會評估爲false。
其他人提到了for
語句,並且它們允許聲明和實例化變量。這是真的,但for
期待一個聲明或assigment documentation explains。
意見可能會有所不同,但對於我來說,所有這些都增加了一個可理解的一致性,而不是循環中行爲的怪癖。A while
循環更好地被認爲是if
語句的循環版本,而不是類似於for
循環。如果在所有這些方面都有些怪異的話,那麼它就是語言與語言正常語法的完全不同。
我在找'爲什麼?' JavaScript不允許const,let,var,而條件和這回答了我的問題。我總是發現令人困惑的是,當我創建一個新變量而不是變量的值時,控制檯報告未定義。 我仍然沒有看到JavaScript的點返回undefined;他們也可以返回變量的值,但是如果它返回undefined,更好的瀏覽器和編譯器在條件中使用時會出錯。 – 2017-07-29 21:30:34
下面的2解釋了變量聲明的提升,但並沒有解釋爲什麼你不能在'while'條件中聲明一個變量(但你可以,例如,在'for'條件下)。你有沒有找到一個很好的解釋呢? – Barney 2014-03-04 11:03:45
另一個JS怪癖,這就是爲什麼。 – 2014-12-17 10:13:50