使用forEach循环Array(n),未定义值的数组

时间:2016-05-27 19:46:21

标签: javascript arrays

我想使用数组构造函数n快速构建一个Array()长度的数组,然后遍历生成的数组。

MDN's docs

  

如果传递给Array构造函数的唯一参数是整数   在0和2 32 -1(包括)之间,这将返回一个新的JavaScript数组   长度设置为该数字。如果参数是任何其他数字,a   抛出RangeError异常。

据推测,执行Array(5)会创建一个长度为5的数组。



var arr = new Array(5);

console.log(arr); // [undefined x 5]
console.log(arr.length); // 5




但是,当我尝试循环生成的数组并注销值或索引时,没有任何反应。

arr.forEach(function(v, i) { console.log(v, i); });

// nothing logs to the console

或者,如果我使用数组文字,并尝试循环遍历值,它会按预期记录:



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

// undefined 0
// undefined 1




为什么我不能遍历由Array构造函数创建的数组?

This answer解释了map出现的一些浏览器异常,例如:

arr.map(function(v, i) { return i; }) // returns [undefined x 5]

但我特别感兴趣的是forEach循环为什么不会对值进行迭代

4 个答案:

答案 0 :(得分:4)

我知道我没有直接回答这个问题,我仍然认为这提供了很好的信息。

Check what Kyle Simpson said recently about this topic.

基本上,

console.log(new Array(5))  // Chrome: [undefinedx5] Firefox: [ <5 empty slots> ]

console.log([undefined, undefined, undefined, undefined, undefined]) // [ undefined, undefined, undefined, undefined, undefined ] 

是完全不同的价值类型。当浏览器显示undefinedx5时,浏览器会(对你说谎)。在第一种情况下应用.map()将不返回任何内容,而在第二种情况下,您可以使用undefined进行操作。

从规范,ecma-262/5.1/#sec-15.4.2.2,唯一的事情是new Array(5),是创建一个类型为Array的对象,其长度为property = 5.文字数组语法[]实际上放置了类型(如果你给它一些东西)在插槽中。

答案 1 :(得分:3)

那是因为ES5数组方法跳过缺失的索引。也就是说,它们将i0迭代到length-1,但在每次迭代时,它们会检查数组是否具有i自己的属性。

如果您希望它起作用,您可以使用fill创建索引。

&#13;
&#13;
var arr = new Array(5).fill();
arr.forEach(function(v, i) { console.log('arr['+i+'] = ' + v); });
&#13;
&#13;
&#13;

答案 2 :(得分:2)

您的代码中似乎有拼写错误:

.first-level-header {
  display: inline-block;
  vertical-align: top;
}

 h1 {
  font-family: sans-serif;
  color: blue;
}

img.site-logo {
  display: inline-block;
  padding-top: 10px;
  padding-left: 10px;
  width: 125px;
  height: 125px;
}

请改用:

arr.forEach(functio(v, i) {

<强>更新

forEach()按升序对数组中的每个元素执行一次提供的回调。对于已删除或未初始化的索引属性(即在稀疏数组上),不会调用它。 MDN article

答案 3 :(得分:-1)

我怀疑这可能与Javascript foreach循环的复杂性有关,而不是Array(int)构造函数。使用正常for循环:

for(var i = 0; i < arr.length; i += 1) {
  console.log(arr[i] + " " + i);
}

产生了预期的结果。

相关问题