如何理解ES6中展开运算符是浅拷贝还是深拷贝

clipboard.png
如上,当对b 进行两次删除修改时,最终导致a 的值发生了变化

var a = [[1], [2], [3]];
var b = [...a];
b.shift().shift();
console.log(a);
console.log(b);
阅读 13.2k
3 个回答

用扩展运算符对数组或者对象进行拷贝时,只能扩展和深拷贝第一层的值,对于第二层极其以后的值,扩展运算符将不能对其进行打散扩展,也不能对其进行深拷贝,即拷贝后和拷贝前第二层中的对象或者数组仍然引用的是同一个地址,其中一方改变,另一方也跟着改变。

算浅吧 只有一层

相当于遍历一层, 浅拷贝.

let a = [{}, {}, {}]
let b = []

for (const item of a) {
  b.push(item)
}
b[0]['test'] = 1

console.log(a)
console.log(b)

//[ { test: 1 }, {}, {} ]
//[ { test: 1 }, {}, {} ]

如果数组内的值, 是值类型, 那么遍历一层, 就相当于拷贝了它的值, 如果是引用类型, 比如二维数组, 那么就是拷贝了它的引用

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题