我最近发现,映射未初始化的数组似乎并不像我预期的那样有效。使用此代码:
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项长,但没有什么,甚至没有在那里未定义......
这有点令人困惑。
有人可以向我解释一下吗?
答案 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)
map
,因为没有元素。普通数组是一个有5个空插槽的数组。
initialArray有5个插槽填充undefined
答案 3 :(得分:0)
我认为这是你的回答,mozilla developers
console.log(normalArray.map(helloMap));
将始终失败,因为它在上下文中运行 - 创建新数组但不能使用未定义的值。
map按顺序为数组中的每个元素调用一次提供的回调函数,并从结果中构造一个新数组。仅对已分配值的数组的索引(包括undefined)调用回调。 不会调用缺少的数组元素(即,从未设置过的索引,已删除的索引或从未赋值的索引)。