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