我使用Array.fill将数组预先填充到其他数组中。修改一个索引的数组也会修改另一个索引的数组。意思是同一个对象。
const arr = Array(2).fill([]);
arr[0].push('a');
arr[1].push('b');
// [['a', 'b'], ['a', 'b']]
我一直在阅读一些文档,但我没有看到任何地方提到过这种行为。同样的事情也发生在一个对象文字上。
这有什么道理吗?
发布于 2016-06-13 13:20:33
是的,确实如此。
您正在传递对已创建对象实例的引用。如果您首先声明数组(例如。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"]]
发布于 2016-06-13 13:23:04
是的,这是合理的。
fill
期望在所有索引中都包含一个值,而不是为每个索引生成一个新值的函数。而且它也不会隐式地克隆您传递的值(没有标准函数这样做)。这只是通常的赋值行为,其中对象(引用值)保持不变。
https://stackoverflow.com/questions/37799249
复制