天天看點

[Effective JavaScript 筆記]第49條:數組疊代要優先使用for循環而不是for...in循環

[Effective JavaScript 筆記]第49條:數組疊代要優先使用for循環而不是for...in循環

該方法確定你需要整數索引和數組元素時就能擷取到它們,并且絕不會混淆它們或引發字元串的強制轉換。此外,它還可以確定正确的疊代數組,并且不會意外地包括存儲在數組對象或其原型鍊中的非整數屬性。

示例

下面代碼中mean的輸出值是多少?

var scores=[98,74,85,77,93,100,89];
var total=0;
for(var score in scores){
    total+=score;
}
var mean=total/scores.length;
mean;//? 17636.571428571428           

用電腦手動算了一下,答案應該是88。說明這段代碼的真正結果應該是88,但為什麼實際結果不正确呢。這和for...in循環會枚舉所有key,包括原型中的。也就是說上面的代碼實際應該是(0+1+2+...+6)/7=21,但也不對。這裡的key即使是數組的索引,對象屬性也始終是字元串。因些,“+=”操作符将執行字元串的連接配接操作。結果就是total的值是"00123456"。mean最終結果是17636.571428571428。無法了解的一個結果。

使用傳統的for循環

var scores=[98,74,85,77,93,100,89];
var total=0;
for(var i=0,n=scores.length;i < n;i++){
    total+=scores[i];
}
var mean=total/scores.length;
mean;//88            

注意點

上面循環中對于變量n的使用,這可以在循環的時候,不用每次都擷取一次數組的長度。

給閱讀該代碼的程式員傳遞一個資訊:循環的終止條件是簡單且确定的。

提示

    • 疊代數組的索引屬性應當總是使用for循環而不是for...in循環
    • 考慮在循環之前将數組的長度存儲在一個局部變量中以避免重新計算數組長度

版權聲明

翻譯的文章,版權歸原作者所有,隻用于交流與學習的目的。

原創文章,版權歸作者所有,非商業轉載請注明出處,并保留原文的完整連結。

繼續閱讀