深浅拷贝与循环引用问题

深拷贝与浅拷贝

浅拷贝

(地址引用):将对象的属性依次复制,只复制一层属性,不会递归复制
+ 不开辟新栈,直接传值和传址
+ 两个对象指向同一个地址,修改同步

深拷贝

(值引用):递归的拷贝对象的所有属性。
+ 开辟新栈,对象对应不同地址,修改互不影响

拷贝的方法

浅拷贝

只拷贝第一层

  1. object.assign(target, ...sources)

target:目标对象,目标对象的内容和新的对象保持同步

sources:源对象

let a = {
    age: 1,
    name:{val:"hello"}
};
let b = Object.assign({}, a);//assign可以有多个参数,全部合并到{}然后给b
a.age = 2;
a.name.val = "you";
console.log(b.age);//1
console.log(b.name);//{val:"you"}
  1. ...
let b = {...a};

深拷贝

JSON.parse(JSON.stringfy(obj))

  • 会忽略undefined
  • 会忽略symbol
  • 会忽略函数
  • 不能解决循环引用的对象 (会报错)

自己写一个深拷贝

不考虑循环引用?

function deepClone(origin){
    if(typeof origin != "object" || !origin){
        return origin;//是对象就继续,否则就返回
    }
    var target = Array.isArray(origin)? [] : {};
    for(let prop in origin){
        if(origin.hasOwnProperty(prop)){//属性是否是对象的自有属性
            if(origin[prop] &&typeof origin[prop] === "object"){
                //是否是对象
                //递归调用复制
                target[prop] = deepClone(origin[prop]);
            }else{
                target[prop] = origin[prop];
            }
        }
    }
    return target;
}

循环引用问题

概念:对象A中包含指向对象B的指针,对象B中包含指向对象A的指针,会引发内存泄漏现象

  1. 父级引用:对象属性是对象本身,导致:子->父->子....循环,栈溢出
    解决:while循环判断一个对象的字段是否引用了这个对象或这个对象的任意父级
  2. 同级引用:对象中的子对象引用了其他的子对象
    解决:用 WeakMap() 记录下对象中的所有对象,并与新创建的对象一一对应,即记录引用关系

未完。

posted @ 2020-04-13 13:09  秋秋秋白  阅读(674)  评论(0编辑  收藏  举报