我想使用数组构造函数n
快速构建一个Array()
长度的数组,然后遍历生成的数组。
如果传递给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
循环为什么不会对值进行迭代。
答案 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数组方法跳过缺失的索引。也就是说,它们将i
从0
迭代到length-1
,但在每次迭代时,它们会检查数组是否具有i
自己的属性。
如果您希望它起作用,您可以使用fill
创建索引。
var arr = new Array(5).fill();
arr.forEach(function(v, i) { console.log('arr['+i+'] = ' + v); });
&#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);
}
产生了预期的结果。