使用Array(n)在javascript中定义数组定义了一个空数组,如果我错了,请纠正我。现在,如果我写下面的代码:
Array(2).map((val) => console.log(val))

..没有任何反应,但是当我将数组的元素分散到另一个数组中时,就像这样:
[...Array(2)].map((val) => console.log(val))

..我得到未定义的控制台日志。谁能帮助我了解这里发生了什么?
答案 0 :(得分:5)
没有传播,数组只是一个具有length
属性的对象,没有填充任何项目:
{length:2, proto :Array(0)}
当您将(...
)传播到数组中时,如果您传播的对象具有length
属性,则会从obj[0]
开始传播那么多项目,{{有问题的对象实际上并不需要具有那些数字属性 - 如果没有,那么传播的结果将是obj[1]
的数组:
undefined
可以迭代console.log([...Array(2)]);
s 的数组< - em> - 此处,指标undefined
和0
执行数组对象,它们恰好没有被分配给任何东西。
1
因此,简而言之,这是因为数组之间的差异,如
const arr = [undefined, undefined];
console.log(1 in arr);
和
{ length: 2 } // no elements to iterate over
请注意,如果您没有使用{ length: 2, 0: undefined, 1: undefined }
返回的转换数组,则不应使用map
- 否则,如果您只想迭代每个项目并.map
它例如,您应该使用console.log
。
答案 1 :(得分:2)
这是因为spread operator采用可迭代的长度,然后迭代传递的值(See spec)。
由于迭代Array(2)
以上的所有返回值未定义,因此您的第二行map
超过[undefined, undefined]
,而您的第一行映射为{{1} }}。请注意,“空”不是实际值。
[empty x 2]
不会迭代“空”条目,例如map
创建的条目,但会迭代Array(2)
个值:
答案 2 :(得分:1)
因为var formData = new FormData();
formData.append('imageName', imageFile);
没有填充数组。但它确实将length属性设置为2.因此,在第一个实例中,Array(2)
没有任何内容可以迭代。但是,解构会创建一个包含map
的2个元素的数组,它允许地图工作,因为undefined
是一个有效的原语。
答案 3 :(得分:0)
这是Array.map的工作原理 - 请在此处阅读:Array.prototype.map()
仅对已分配的数组的索引调用回调 值,包括undefined。它没有被称为缺少元素 数组(即从未设置过的索引,已经是 已删除或从未分配过值。)