使用forEach的奇怪数组构造函数行为

时间:2015-02-17 20:29:30

标签: javascript arrays foreach

在我的网站上工作时,我无意中偶然发现了以下数组行为,我无法真正解决这个问题。

如果我在我的剧本中写这样的东西:

Array(4).forEach(function(elem) {console.log(elem);});

我没有返回任何日志条目,也没有返回任何内容。

相反,如果我写这个:

[undefined,undefined,undefined,undefined].forEach(function(elem) {console.log(elem);});

我确实得到了4个日志条目。

我的问题是 ,这是为什么?为什么我不能获取数组构造函数的日志条目,而是使用[]获取它们? constructor specification forEach specification 都没有真正逃到undefined或帮助我理解这一点。

1 个答案:

答案 0 :(得分:2)

MDN on forEach

  

forEach()按升序为数组中的每个元素 present 执行一次提供的回调。对于已删除或删除的索引,不会调用它。但是,它是针对存在且值未定义的元素执行的。

初始化数组的方式确实设置了它的长度,但没有将数组中的值设置为任何值,因此forEach不会迭代这些元素:

  

如果参数len是数字且ToUint32(len)等于len,则新构造的对象的length属性设置为ToUint32(len)

示例:

var a = Array(5);

a.forEach(function(element){
  console.log('First log:', element)
});

a[2] = true;
a[3] = undefined;

a.forEach(function(element){
  console.log('Second log:', element)
});

var b = [];
b[999] = 'Foobar';

b.forEach(function(element){
  console.log('Third log:', element)
});

正如您在控制台中看到的那样,它只是跳过没有设置值的索引。