带apply的javascript数组映射
我试图在javascript中用0声明和初始化一个数组。我创建了一个数组,并像这样设置长度带apply的javascript数组映射,javascript,arrays,Javascript,Arrays,我试图在javascript中用0声明和初始化一个数组。我创建了一个数组,并像这样设置长度 var previousRow = []; previousRow.length = 5; 然后,我做了这个 console.log(previousRow); previousRow = previousRow.map(Number.prototype.valueOf, 0); console.log(previousRow); 我得到了 [ , , , , ] [ , , , , ] 但是,
var previousRow = [];
previousRow.length = 5;
然后,我做了这个
console.log(previousRow);
previousRow = previousRow.map(Number.prototype.valueOf, 0);
console.log(previousRow);
我得到了
[ , , , , ]
[ , , , , ]
但是,当我这么做的时候
console.log(previousRow);
previousRow = Array.apply(null, previousRow).map(Number.prototype.valueOf, 0);
console.log(previousRow);
我得到了我所期望的
[ , , , , ]
[ 0, 0, 0, 0, 0 ]
为什么第一个代码不起作用?请阅读MDN文档了解更多信息。它明确指出:
回调
仅对具有赋值的数组索引调用;对于已删除或从未赋值的索引,不会调用它
previousRow
数组是长度为的空数组
5
。但是,从未为元素指定过值:
var previousRow = [];
previousRow.length = 5;
由于previousRow
的元素从未被赋值,map
将不会对其进行处理。因此,将Number.prototype.valueOf
映射到previousRow
将导致5个元素的空数组:
console.log(previousRow);
previousRow = previousRow.map(Number.prototype.valueOf, 0);
console.log(previousRow);
但是,当将上一行
应用于数组
构造函数时,构造函数将创建一个新数组,并将上一行
的值分配给新数组
是否为previousRow
的元素赋值并不重要。当JavaScript找不到值时,它会提供undefined
因此,净效果是新数组有5个元素,所有元素都由数组构造函数显式地赋值未定义。因此,您可以使用map
处理整个阵列:
console.log(previousRow);
previousRow = Array.apply(null, previousRow).map(Number.prototype.valueOf, 0);
console.log(previousRow);
您应该阅读以下答案以获得更深入的解释:请参阅相关内容: