忽然以爲本身好像沒學過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 循環循環的值永遠是key, key是一個字符串。因此total的值是:'0012'。它是一個字符串,字符串'0012'/3,0012會被轉換成12,而後除以3,結果是4。瀏覽器

後記

這個示例是來自《編寫高質量JavaScript的68個方法》的第49條:數組迭代要優先使用for循環而不是for in循環
既然已經發布,就可能有好事者拿出去當面試題。這個題目頗有可能坑一堆人。其中包括我。安全

這裏涉及到許多js的基礎知識.優化

  1. for in 循環是循環對象的索引屬性,key是一個字符串。
  2. 數值類型和字符串相加,會自動轉換爲字符串
  3. 字符串除以數值類型,會先把字符串轉爲數值,最終結果爲數值

正確方法code

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);

這樣寫有幾個好處。對象

  • 循環的終止條件簡單且明確
  • 即便在循環體內修改了數組,也能有效的終止循環。不然就可能變成死循環。
  • 編譯器很難保證重啓計算scores.length是安全的。
  • 提早肯定了循環終止條件,避免屢次計算數組長度。這個可能會被一些瀏覽器優化。
相關文章
相關標籤/搜索