JavaScript中Array.slice(0)返回的拷贝是否为浅拷贝?
是的,Array.slice(0) 返回的是数组的浅拷贝
你理解的完全正确!Array.slice(0) 确实会返回原数组的一个浅拷贝,具体来说就是:
- 新数组会拥有独立的内存地址:它是一个全新的数组容器,和原数组不是同一个对象;
- 数组元素仍指向原内存地址:如果数组里存的是引用类型(比如对象、数组),新数组里的元素和原数组的对应元素其实是同一个引用;如果是原始值(比如字符串、数字),则是值的复制(但原始值本身不可变,所以表现上和引用类似)。
咱们来看你给出的示例代码:
let oldArray = ['old', 'array']; let newArray = oldArray.slice(0); let sameElement = oldArray[0] === newArray[0]; // true let sameArray = oldArray === newArray; // false
这个结果完美验证了浅拷贝的特性:
oldArray === newArray返回false,说明两个数组是不同的对象,新数组有自己的内存空间;oldArray[0] === newArray[0]返回true,对于字符串这种原始值来说,是值完全相等;如果换成引用类型,这个特性会更明显:
let oldArray = [{name: 'Alice'}, 'test']; let newArray = oldArray.slice(0); // 修改新数组里的对象属性 newArray[0].name = 'Bob'; // 原数组的对象也会跟着变化 console.log(oldArray[0].name); // 输出 'Bob'
这就是因为浅拷贝只复制了数组容器,而没有递归复制里面的引用类型元素,所以它们依然共享同一个内存地址。
内容的提问来源于stack exchange,提问作者Ole
相关产品推荐
相关产品推荐

