`new Array(5).map()`如何工作?

时间:2017-04-06 13:05:56

标签: javascript arrays

我最近发现,映射未初始化的数组似乎并不像我预期的那样有效。使用此代码:

function helloMap(value, index) {
    return "Hello " + index;
}

console.clear();

var initialArray = Array.apply(null, new Array(5));

console.log("Array initialised with apply:");
console.log(initialArray);
console.log(initialArray.map(helloMap));

var normalArray = new Array(5);

console.log("Array constructed normally");
console.log(normalArray);
console.log(normalArray.map(helloMap));
.as-console-wrapper {
  max-height: 100% !important;
}

尽管每个数组的第一个输出为[undefined, undefined, undefined, undefined, undefined],但我得到了不同的结果。

我获得不同结果的事实意味着这两个数组中的undefined实际上是不同的。在第一个我怀疑该数组有5个项目,每个都是未定义的。在第二个数组是5项长,但没有什么,甚至没有在那里未定义......

这有点令人困惑。

有人可以向我解释一下吗?

4 个答案:

答案 0 :(得分:3)

根据MDN Array.prototype.map

  

map为一个元素中的每个元素调用一次提供的回调函数   数组,按顺序,并从结果中构造一个新数组。打回来   被调用only for indexes of the array which have assigned values,   包括undefined。它没有被称为缺少的元素   数组(即从未设置过的索引,已经过了   已删除或从未分配过值。)

这两个数组在Array.map执行回调的方式上有所不同。 由于第二个场景中的数组没有索引map返回空

原因

答案在于Array构造函数

在第一个场景中,您将一个长度为5的数组传递给index the array based on the length的Array构造函数,但在第二个场景中,您只使用长度为5的数组

当您使用Object.keys(initialArray)

运行Object.keys(normalArray)时,您将了解其中的差异

请尝试查看以下示例。

function helloMap(value, index) {
    return "Hello " + index;
}

console.clear();

var initialArray = Array.apply(null, new Array(5));

console.log("Array initialised with apply:");
console.log(initialArray);
console.log(initialArray.map(helloMap));

var normalArray = new Array(5);

console.log("Array constructed normally");
console.log(normalArray);
console.log(normalArray.map(helloMap));

//DIFFERENCE
console.log("Initial Array: "+Object.keys(initialArray));
console.log("Normal Array: "+Object.keys(normalArray));
.as-console-wrapper {
  max-height: 100% !important;
}

答案 1 :(得分:1)

Array.apply(null, Array(5))实际上填充了您传递的数组(或类似数组的对象)作为第二个参数,并传递了您传入的第一个参数的值,如MDN Docs中所示。< / p>

new Array(5)只是初始化一个数组,其长度属性设置为5的参数。再次,如MDN docs

中所示
  

如果传递给Array构造函数的唯一参数是0到2 32 -1(包括)之间的整数,则返回一个新的JavaScript数组及其length属性设置为该数字(注意:这意味着一个arrayLength个空插槽数组,而不是具有实际未定义值的插槽)。

答案 2 :(得分:1)

没有在normalArray的任何元素上调用

map,因为没有元素。普通数组是一个有5个空插槽的数组。

initialArray有5个插槽填充undefined

答案 3 :(得分:0)

我认为这是你的回答,mozilla developers

console.log(normalArray.map(helloMap));将始终失败,因为它在上下文中运行 - 创建新数组但不能使用未定义的值。

  

map按顺序为数组中的每个元素调用一次提供的回调函数,并从结果中构造一个新数组。仅对已分配值的数组的索引(包括undefined)调用回调。 不会调用缺少的数组元素(即,从未设置过的索引,已删除的索引或从未赋值的索引)。