其他分享
首页 > 其他分享> > 浅拷贝与深拷贝

浅拷贝与深拷贝

作者:互联网

JS 中有个重要的类型叫做引用类型。这种类型在使用的过程中,因为传递的值是引用,所以很容易发生一些副作用,比如:

let a = { age: 1 }
let b = a
b.age = 2

上述代码的写法会造成 a 和 b 的属性都被修改了。大家在日常开发中肯定不想出现这种情况,所以都会用上一些手段去断开它们的引用连接。对于上述的数据结构来说,浅拷贝就能解决我们的问题。

方法一:...运算符

let a = { age: 1 }
let b = { ...a }
b.age = 2

方法二:Object.assign

let a = { age: 1 }
let b = Object.assign(a)

但是浅拷贝只能断开一层的引用,如果数据结构是多层对象的话,浅拷贝就不能解决问题了,这时候我们需要用到深拷贝。

深拷贝的做法一般分两种:

第一种:JSON.stringify

原理:是将对象转化为字符串,而字符串是简单数据类型。

这种写法非常简单,而且可以应对大部分的应用场景,但是它还是有很大缺陷的,比如拷贝其他引用类型、拷贝函数、循环引用等情况。

第二种:递归拷贝

function deepClone(source){
  const targetObj = source.constructor === Array ? [] : {}; // 判断复制的目标是数组还是对象
  for(let keys in source){ // 遍历目标
    if(source.hasOwnProperty(keys)){
      if(source[keys] && typeof source[keys] === 'object'){ // 如果值是对象,就递归一下
        targetObj[keys] = source[keys].constructor === Array ? [] : {};
        targetObj[keys] = deepClone(source[keys]);
      }else{ // 如果不是,就直接赋值
        targetObj[keys] = source[keys];
      }
    }
  }
  return targetObj;
}  

标签:keys,age,source,targetObj,let,拷贝
来源: https://www.cnblogs.com/yixiancheng/p/12067816.html