javascript的Array.slice(0)会返回一个浅拷贝吗?

5

据我所知,Array.slice(0)返回的是数组的一个副本。这是一个浅拷贝吗?换句话说,数组项仍然具有相同的内存位置,但数组容器被分配了一个新的位置?

实际上:

let oldArray = ['old', 'array'];
let newArray = oldarray.slice(0);
let same = oldArray[0] === newArray[0]; //true 
let same = oldArray === newArray; //false

2
是的,如果数组中的项是对象,则它们不会被复制,只会在新的数组容器中引用。您必须付出一些重要的努力来实际深度复制数组和对象(值得庆幸的是)。 - CertainPerformance
2个回答

5
是的,看演示:

var o = [{
  x: 1
}]
var o2 = o.slice(0)
o2[0].x = 2
console.log(o[0].x)


3

您是正确的 - 它确实创建了一个浅拷贝。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice

该slice()方法返回一个从begin到end(不包括end)所选的数组部分的新数组对象的浅拷贝。原始数组将不会被修改。 如果您想要深拷贝,可以使用旧方法:

var arr = [1]; 
var arr2 = JSON.parse(JSON.stringify(arr));

arr[0] = 99;
arr2[0] = 1000;

console.log({arr, arr2});


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接