【JS】中深拷贝浅拷贝的区别和实现方式

1、概念

  1. 赋值不属于拷贝
  2. JS的 深拷贝浅拷贝主要作用于多层数组或对象中,其中:

浅拷贝:

只对第一层 数组或对象进行复制,其它层复制的是原存储的内存地址(修改其它深层级会影响原对象)

深拷贝:

构造一个新的复合数组或对象,每一层级 都在堆内存中开辟了新的空间,与原数组或对象互相不影响。

2、实现方式

浅拷贝的实现方式:

  1. 针对对象:使用 Object.assign() 方法,例如:let newObj = Object.assign({}, oldObj);
  2. 针对数组或对象:使用扩展运算符(...)进行浅复制,例如:let newObj = {…oldObj};let newArr = […oldArr];
  3. 针对数组:使用数组的 slice() 方法进行浅复制,例如:let newArray = oldArray.slice()

深拷贝的实现方式

  1. JSON.parse(JSON.stringfy(obj))
    JSON.parse(JSON.stringify(obj)):将对象序列化为 JSON 字符串,再将字符串解析为新的对象。这种方式可以实现深拷贝,但有一些限制,例如无法复制函数、循环引用等不可序列化的属性;
  2. 手动递归拷贝
    使用递归的方式遍历对象的属性,逐一复制到新的对象中。这种方式可以实现深拷贝,但需要手动编写代码,并且不适用于嵌套层数较深的对象。
// 递归实现深拷贝
function deepClone(obj) {
    
    
 if (typeof obj !== 'object' || obj === null) {
    
    
   return obj;
 }
 let newObj = Array.isArray(obj) ? [] : {
    
    };
 for (let key in obj) {
    
    
   newObj[key] = deepClone(obj[key]);
 }
 return newObj;
}
  1. Lodash 的 _.cloneDeep() (使用第三方库)
    可以实现深拷贝,支持复制函数、循环引用等特殊属性,使用方便;

猜你喜欢

转载自blog.csdn.net/sunshineTing2/article/details/131941961