浅拷贝与深拷贝
作者:互联网
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