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

Array.fill uses the same object for all indices

我正在使用 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 期望将一个值放入所有索引中,而不是为每个索引生成新值的函数。而且它也不会隐式克隆您传递的值(没有标准函数会这样做)。这只是通常的赋值行为,其中对象(引用值)保持不变。