- 什么是深拷贝、浅拷贝
深拷贝:修改新变量的值不会影响原有变量的值,相当于创造一个一模一样的新对象,新旧对象不共享内存
浅拷贝:修改新变量的值会影响原有的变量的值,只复制对象的引用,新旧对象共享同一块内存
对于基本数据类型,拷贝的是变量的值。
把一个对象赋值给一个变量时,赋的是该对象在栈中的地址,而不是堆中的数据。也就是说此时两个对象指向同一块存储空间,因此,修改新变量的值也会影响原有的变量值,新对象和原对象的值是联动的。
和原数据是否指向同一对象 | 第一层为基本数据类型 | 原数据中包含子对象 | |
---|---|---|---|
赋值 | 是 | 同时改变 | 同时改变 |
浅拷贝 | 否 | 不会同时改变 | 同时改变 |
深拷贝 | 否 | 不会同时改变 | 不会同时改变 |
- 浅拷贝实现
(1)Object.assign({},obj)
- 把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。
1 | let obj = { |
(2)Array.prototype.concat() 与 Array.prototype.slice()
1 | let arr = [1, 2, [3, 4]]; |
(3)… 运算符
1 | let obj = { |
- 深拷贝实现
(1)JSON.parse( JSON.stringify() )
1 | let obj = { |
(2)递归实现
1 | function deepCopy(obj) { |
(3)lodash 函数库实现
1 | var objects = [{ 'a': 1 }, { 'b': 2 }]; |
- 本文作者: 不想
- 本文链接: https://evacat.top/2022/02/11/深拷贝和浅拷贝/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!