带apply的javascript数组映射

带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); 我得到了 [ , , , , ] [ , , , , ] 但是,

我试图在javascript中用0声明和初始化一个数组。我创建了一个数组,并像这样设置长度

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);
您应该阅读以下答案以获得更深入的解释:

请参阅相关内容: