js 深拷贝

例子

let a = {
    name: 'demo',
    age: 18
};

let b = a;
b.name = 'demo1';

console.log(a); // 输出 {name: "demo1", age: 18}
console.log(b); // 输出 {name: "demo1", age: 18}

因为JS对于对象的赋值使用的是浅拷贝,其中一个实例变量的赋值会影响到所有指向该对象变量

解决方案

  1. 粗暴好使的 JSON.parse(JSON.stringify),缺点: 丢失成员函数
  2. Object.assign,缺点:只有第一级深拷贝,子级对象依旧是浅拷贝,例子如下:

    let a = {name:{demo:'1'}};
    let b = Object.assign({}, a);
    console.log(a); // 输出 {name:{demo:'1'}}
    console.log(b); // 输出 {name:{demo:'1'}}
    b.name.demo = '2';
    console.log(a); // 输出 {name:{demo:'2'}}
    console.log(b); // 输出 {name:{demo:'2'}}

 手动实现原理

  1. 遍历待拷贝对象
  2. 判断当前值类型,如果是object类型且不是null(null也是object),则递归调用拷贝函数
  3. 如果当前值类型时null或者非object类型,直接return,退出本次递归

编码实现

function deepCopy(obj) {
    let result = obj;
    if(typeof obj === 'object' && obj !== null) {
        result = Object.prototype.toString.call(obj) === '[object Array]' ? []: {};
        for(let prop in obj) {
            result[prop] = deepCopy(obj[prop]);
        }
    }
    return result;
}

验证一下:

let a = {name:{demo:'1'}};
let b = deepCopy(a);
console.log(a); // 输出 {name:{demo:'1'}}
console.log(b); // 输出 {name:{demo:'1'}}
b.name.demo = '2';
console.log(a); // 输出 {name:{demo:'1'}}
console.log(b); // 输出 {name:{demo:'2'}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值