我在Codepen的一個特定for循環的執行順序中有點難以置信。看看這兩個循環,這都做同樣的事情:JavaScript for循環執行的確切順序是什麼?
var a = ['orange','apple'];
for (var i=0; i<2;i++) {
alert(a[i]);
}
for (var j=0, fruit; fruit = a[j++];) {
alert(fruit);
}
您可以在這裏的行動看到這一點:http://codepen.io/nickbarry/pen/MYNzLP/
第一個循環是寫一個for循環的標準,香草方式。正如預期的那樣,它會提醒「橙色」,然後是「蘋果」。
我寫了第二個循環使用MDN的建議(搜索「成語」,這裏:https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript)。
它的工作原理,但我不明白爲什麼。我對for循環的理解顯然是不正確的(不止一種方式): * for循環在第一次運行之前評估第二個表達式的真實性。所以,當for循環正在評估第二個表達式的真實性時,它似乎應該在設置水果的值之前增加j。所以第一次通過循環,水果應該等於「蘋果」。 *循環只能運行一次,因爲在第一次通過後,當它再次計算第二個表達式以查看它是否仍然爲真時,它應該再次遞增j,然後它將值返回給果實,並且由於沒有值在索引位置2時,它應該返回一個虛假結果,並退出循環。
我不明白究竟發生了什麼。 for循環在第二個表達式計算之前運行一次嗎?但這似乎是不可能的,因爲如果發生這種情況,警報將在第一次通過時沒有提醒,因爲水果還沒有價值。
此外,MDN文章的作者似乎喜歡寫循環的第二種方式 - 有沒有一個原因,方式更好?它使用較少的字符,這是很好的,我猜。跳過for循環中的第三個表達式可以節省大量時間嗎?或者它只是一個「很酷,因爲它很聰明」的東西?
它工作的原因是它是一個後增量,而不是預增量。如果它是'++ j'而不是'j ++',那麼你的假設是真實的。 –
如果你的目標是製造敵人,編寫循環的第二種方法非常好。沒有真正的好處,它很難閱讀,如果數組中存在虛假值並且可能較慢(儘管測試需要確定),它會過早停止。 –
請注意,MDN是一個wiki。任何半智慧都可以添加內容。同一篇文章實際上暗示了數組的「for-in」,但沒有給出所有可能遇到的問題的完整解釋。 –