突然覺得自己好像沒學(xué)過JS
前言
一、先看題:mean的值是什么?
var scores = [10,11,12];var total = 0;for(var score in scores){
?total += score;
}var mean = total/scores.length;console.log(mean);
二、是11?
恭喜你:答錯了!
三、是1?
恭喜你:答錯了!
四、正確答案: 4
解釋: for in 循環(huán)循環(huán)的值永遠是key, key是一個字符串。所以total的值是:'0012'。它是一個字符串,字符串'0012'/3,0012會被轉(zhuǎn)換成12,然后除以3,結(jié)果是4。
五、后記
這個示例是來自《編寫高質(zhì)量JavaScript的68個方法》的第49條:數(shù)組迭代要優(yōu)先使用for循環(huán)而不是for in循環(huán)。
既然已經(jīng)發(fā)布,就可能有好事者拿出去當面試題。這個題目很有可能坑一堆人。其中包括我。
這里涉及到許多js的基礎(chǔ)知識:
for in 循環(huán)是循環(huán)對象的索引屬性,key是一個字符串。
數(shù)值類型和字符串相加,會自動轉(zhuǎn)換為字符串。
字符串除以數(shù)值類型,會先把字符串轉(zhuǎn)為數(shù)值,最終結(jié)果為數(shù)值。
六、正確操作
var scores = [10,11,12];var total = 0;for(var i=0, n=scores.length; i < n; i++){
?total += scores[i];
}var mean = total/scores.length;console.log(mean);
這樣寫有幾個好處:
循環(huán)的終止條件簡單且明確。
即使在循環(huán)體內(nèi)修改了數(shù)組,也能有效的終止循環(huán)。否則就可能變成死循環(huán)。
編譯器很難保證重啟計算scores.length是安全的。
提前確定了循環(huán)終止條件,避免多次計算數(shù)組長度。這個可能會被一些瀏覽器優(yōu)化。
關(guān)鍵詞:JavaScript,面試題,for循環(huán)與for in循環(huán)的區(qū)別,JS數(shù)組,遍歷數(shù)組注意事項