深拷贝与浅拷贝
浅拷贝
(地址引用):将对象的属性依次复制,只复制一层属性,不会递归复制
+ 不开辟新栈,直接传值和传址
+ 两个对象指向同一个地址,修改同步
深拷贝
(值引用):递归的拷贝对象的所有属性。
+ 开辟新栈,对象对应不同地址,修改互不影响
拷贝的方法
浅拷贝
+ Array.concat()
+ Object.assign()
深拷贝
+ JSON.parse()+JSON.stringify():用例:`const obj2 = JSON.parse(JSON.stringify(obj1));`
+ ~缺点:
+ undefined、任意的函数、正则表达式类型以及 symbol 值,在序列化过程中会被忽略或者被转换成 null(数组对象)
+ 抛弃constructor
+ 存在循环引用
+ 自己写递归函数(轮子)
+ 第三方库:jq 的extend(true, result, src1, src2[ ,src3])、lodash 的cloneDeep(src)
循环引用问题
概念:对象A中包含指向对象B的指针,对象B中包含指向对象A的指针,会引发内存泄漏现象
- 父级引用:对象属性是对象本身,导致:子->父->子....循环,栈溢出
解决:while循环判断一个对象的字段是否引用了这个对象或这个对象的任意父级 - 同级引用:对象中的子对象引用了其他的子对象
解决:用 WeakMap() 记录下对象中的所有对象,并与新创建的对象一一对应,即记录引用关系
未完。