倏忽以为本身彷佛没学过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. 字符串除以数值范例,会先把字符串转为数值,终究效果为数值

准确要领

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是平安的。
  • 提早肯定了轮回停止前提,防止屡次盘算数组长度。这个能够会被一些浏览器优化。
    原文作者:Carl
    原文地址: https://segmentfault.com/a/1190000008823431
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞