什么时候可以迭代一个空数组?

时间:2018-05-07 08:15:02

标签: javascript arrays

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



Array(2).map((val) => console.log(val))




..没有任何反应,但是当我将数组的元素分散到另一个数组中时,就像这样:



[...Array(2)].map((val) => console.log(val))




..我得到未定义的控制台日志。谁能帮助我了解这里发生了什么?

4 个答案:

答案 0 :(得分:5)

没有传播,数组只是一个具有length属性的对象,没有填充任何项目:

  

{length:2, proto :Array(0)}

当您将(...)传播到数组中时,如果您传播的对象具有length属性,则会从obj[0]开始传播那么多项目,{{有问题的对象实际上并不需要具有那些数字属性 - 如果没有,那么传播的结果将是obj[1]的数组:

undefined

可以迭代console.log([...Array(2)]); s 的数组< - em> - 此处,指标undefined0 执行数组对象,它们恰好没有被分配给任何东西。

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)个值:

  

enter image description here

答案 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。它没有被称为缺少元素   数组(即从未设置过的索引,已经是   已删除或从未分配过值。)