var arr = [ ['hello', 'and', 'hi'], [2,3,4] ],
arr2 = arr.slice();
arr2[1].push(44);
arr[0] = "new value";
console.log(arr, arr2);
//["new value", [2, 3, 4, 44]]
//[["hello", "and", "hi"], [2, 3, 4, 44]]
arr2 = arr.slice()
是不是应该创建arr
的新副本?因此,arr2[1].push(44)
不会影响原始arr
有人能告诉我为什么控制台记录的arr在第二个元素中有44号吗?
答案 0 :(得分:1)
来自文档:
对于对象引用(而不是实际对象),slice将对象引用复制到新数组中。原始数组和新数组都引用相同的对象。如果引用的对象发生更改,则更改对新的和原始数组都可见。
所以这是一个理想的行为 - 您已经复制了对第二个数组的引用,因此它已在arr
和arr2
个变量中进行了更改。