深浅拷贝(面试高频)

深浅拷贝(对象与对象之间的关系)

1、赋值

  • 定义:把一个对象的地址赋值给另外一个变量,两个变量操作同一个空间地址。
var obj1 = {
	name:'Jack'
}
var obj2 = obj1
obj2.name = 'Rose'
console.log(obj1,obj2)//{name:"Rose"}{name:"Rose"}

2、浅拷贝

  • 定义:把对象里面的每一个成员,复制一份一模一样的放到另一个对象里面。
  • 缺点:当对象的某一个成员是复杂数据类型的时候,这个成员的地址不会发生改变。
//虽然他们的值一模一样,但是obj1和obj2是两个对象空间
//对obj2的操作并不会改变obj1的值
var obj1 = {
    name:'Jack',
    age:18
}
var obj2 = {}
for (let key in obj1) {
   obj2[key] = obj1[key]
}
obj2.name = "我是obj2"
console.log(obj1,obj2)

3、深拷贝

  • 定义:对象空间里面不管有多少层,都是相对独立的
  • 实现方案1:
var obj1 = {
    name: 'Jack',
    age: 18,
    student :{
        subject: {
            chinese: 100,
            math: 80,
            english: 60
        },
        score: [100, 23, 45, 57, 89]
    }
};
var obj2 = {}
function deep(obj2, obj1){
    for (let key in obj1) {
        if (obj1[key].constructor === Array) {
            obj2[key] = [];
            deep(obj2[key], obj1[key]);
        }
        else if (obj1[key].constructor === Object) {
            obj2[key] = {};
            deep(obj2[key], obj1[key]);
        }
        else {
            obj2[key] = obj1[key];
        }
    }
}
obj2 = JSON.parse(JSON.stringify(obj1))
obj2.class.subject.math = '数学'
obj2.class.subject.english = '英语'
obj2.class.score[20] = 'yeah'
console.log(obj1, obj2)
  • 实现方案2:
    原理:将复杂数据类型转换成简单数据类型(字符串)
obj2 = JSON.parse(JSON.stringify(obj1))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值