Arrays Array.fill对所有索引使用相同的对象

Arrays Array.fill对所有索引使用相同的对象,arrays,ecmascript-6,fill,Arrays,Ecmascript 6,Fill,我正在使用Array.fill用其他数组预填充一个数组。修改一个索引的数组也会修改另一个索引的数组。意思是它是同一个物体 const arr = Array(2).fill([]); arr[0].push('a'); arr[1].push('b'); // [['a', 'b'], ['a', 'b']] 我已经阅读了一些文档,但我没有看到任何地方提到这种行为。对象文字也会发生同样的情况 这有什么意义吗?是的 您正在传递对已创建对象实例的引用。 如果您首先声明数组(例如var c=[]

我正在使用Array.fill用其他数组预填充一个数组。修改一个索引的数组也会修改另一个索引的数组。意思是它是同一个物体

const arr = Array(2).fill([]);

arr[0].push('a');
arr[1].push('b');

// [['a', 'b'], ['a', 'b']]
我已经阅读了一些文档,但我没有看到任何地方提到这种行为。对象文字也会发生同样的情况

这有什么意义吗?

是的

您正在传递对已创建对象实例的引用。 如果您首先声明数组(例如
var c=[]
),然后用它填充
arr
,您将得到相同的行为

const c = [];
const arr = Array(2).fill(c);

c.push("a");    
c.push("b");

// c ["a", "b"]
// arr [reference to c, reference to c] => [["a","b"], ["a", "b"]]

是的,这是有道理的


fill
要求在所有索引中输入一个值,而不是为每个索引生成一个新值的函数。它也不会隐式克隆您传递的值(没有标准函数会这样做)。这只是通常的赋值行为,对象(参考值)保持不变。

非常感谢验证。我想这就是发生的情况,但不确定这是否是正确的行为。这并不能回答您的问题,但如果您正在尝试解决此意外行为,则可以使用数组。from({length:2},()=>[]);以预先填充数组@约瑟莫西拉·罗德里戈:是的,这就是我最后得到的答案。