我想知道为什么无法对未定义的数组使用forEach方法。
代码:
var arr = new Array(5); // [undefined x 5]
//ES5 forEach
arr.forEach(function(elem, index, array) {
console.log(index);
});
//underscore each
_.each(arr, function(elem, index, array) {
console.log(index);
});
这两个示例都没有执行函数。
现在要使用foreach,我必须做:
var arr = [0,0,0,0,0];
然后对它进行forEach操作。
我正在尝试创建一个指定大小的数组并循环遍历它,避免使用for
循环。 我认为使用forEach比for循环更清晰。 对于长度为5的数组,这不是问题,但对于更大的数组来说,会很丑陋。
为什么循环遍历未定义值的数组存在问题?
Array(5)
不是一个由undefined
组成的数组。即使它的.length
已经预定义,它也没有任何成员,数量为0
。 - cookie monsterundefined
”时期望什么。无论它遍历什么,.forEach()
方法始终会返回undefined
。这个问题似乎应该是回调函数是否被调用的问题。 - cookie monsterArray(5)
本质上等同于var arr = []; arr.length = 5
。这意味着更改数组的长度不会为其数值属性设置任何值(数值属性为 undefined 而不是具有未定义的值)。 - soulcheckarr
的第二个成员设置为undefined
值,所以该成员确实存在。现在像这样做var arr = [1, , 2]
。你会发现第二个成员被跳过了。这是因为JS数组可以是稀疏的,当forEach()
迭代时,它会进行一个in
测试来查看成员是否存在,如果不存在,它会跳过该成员而不是调用回调函数。 - cookie monstervar arr = Array.apply(null, Array(5))
。这有点长,但不是太糟糕。或者创建一个单独的函数来为你完成它。function A(n) { return Array.apply(null, Array(n)); }
var arr = A(5);
- cookie monster