JS:深拷贝与浅拷贝

浅拷贝:

  • 基本数据类型的改变、不会影响被赋给对象的基本数据类型的改变
  • 复杂数据类型的改变、会影响被赋给对象的复杂数据类型的改变
// 基本数据类型(number、string、boolean、null、undefined):obj1改变、不会影响obj2
// 复杂数据类型(function、array、object):obj1改变、会影响obj2
const obj1 = {
    name: '张三',
    hobbys: ['篮球', '足球', '乒乓球'],
    hourse: {
        price: '1000000',
        color: 'pink',
        floors: 3
    },
    say() {
        console.log("----");
    },
}
let obj2 = {};

function copy(o1, o2) {
    for(let key in o1) {
        if (o2[key]) {
            continue;
        }
        o2[key] = o1[key];
    }
    return o2;
}
obj2 = copy(obj1, obj2);

obj1.name = '王五';
obj1.hobbys[0] = '羽毛球';
obj1.hourse.color= 'red';

console.log('obj1.name====>',obj1.name); // 王五
console.log('obj1.hobbys====>',obj1.hobbys); // ["羽毛球", "足球", "乒乓球"]
console.log('obj1.hourse====>',obj1.hourse); // {price: "1000000", color: "red", floors: 3}

console.log('obj2.name====>',obj2.name); // 张三
console.log('obj2.hobbys====>',obj2.hobbys); // ["羽毛球", "足球", "乒乓球"]
console.log('obj2.hourse====>',obj2.hourse); // {price: "1000000", color: "red", floors: 3}

 深拷贝:

  • 基本数据类型的改变、不会影响被赋给对象的基本数据类型的改变
  • 复杂数据类型的改变、不会影响被赋给对象的复杂数据类型的改变
// 基本数据类型(number、string、boolean、null、undefined):obj1改变、不会影响obj2
// 复杂数据类型(function、array、object):obj1改变、不会影响obj2
const obj1 = {
    name: '张三',
    hobbys: ['篮球', '足球', '乒乓球'],
    hourse: {
        price: '1000000',
        color: 'pink',
        floors: 3
    },
    say() {
        console.log("----");
    },
}
let obj2 = {};

function deepCopy(o1, o2) {
    for(let key in o1) {
        if (o1[key] instanceof Array) {
            o2[key] = [];
            deepCopy(o1[key], o2[key]);
        } else if (o1[key] instanceof Object) {
            o2[key] = {};
            deepCopy(o1[key], o2[key]);
        } else if (o1[key] instanceof Function) {
            o2[key]= function(){};
            deepCopy(o1[key], o2[key]);
        } else {
            if (o2[key]) {
                continue;
            }
            o2[key] = o1[key];
        }
    }
    return o2;
}
obj2 = deepCopy(obj1, obj2);
obj1.name = '王五';
obj1.hobbys[0] = '羽毛球';
obj1.hourse.color= 'red';
console.log('obj1.name====>',obj1.name); // 王五
console.log('obj1.hobbys====>',obj1.hobbys); // ["羽毛球", "足球", "乒乓球"]
console.log('obj1.hourse====>',obj1.hourse); // {price: "1000000", color: "red", floors: 3}

console.log('obj2.name====>',obj2.name); // 张三
console.log('obj2.hobbys====>',obj2.hobbys); // ["篮球", "足球", "乒乓球"]
console.log('obj2.hourse====>',obj2.hourse); // {price: "1000000", color: "pink", floors: 3}

 

 

  • 16
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值