浅拷贝和深拷贝

我的理解是

对象的浅拷贝是一个改变时另一个也会改变,它只拷贝一层对象的属性

对象的深拷贝是一个改变时另一个不会改变,因为两个对象对应的地址不一样

下面记录一下深拷贝有哪些常用的方法

方法一:常用 递归拷贝

var obj={
            "name":"gao",
            "age":18,
            "list":{
                "title":"新闻"
            }
        }
function deepCopy(obj){
            // 如果obj不是对象或数组,直接返回obj  
            if (typeof obj !== 'object' || obj === null) {  
                return obj;  
            }  
            // 创建一个新对象或数组 
            var copyObj = Array.isArray(obj) ? [] : {}; 

            for(var key in obj){
                if(obj.hasOwnProperty(key) == true ){

                    if(obj[key] instanceof Object ){

                        copyObj[key]= deepCopy(obj[key])
                    }else{
                        copyObj[key]=obj[key]
                    }
                }
            }


            return copyObj;
        }

var o2= deepCopy(obj)

obj.list.title="娱乐"
console.log(obj);
console.log(o2);

方法二:简单但有缺点,这种方式不能复制函数和 undefined,以及日期和正则表达式对象。

let obj1 = { a: 1, b: 2, c: function() {} };  
let obj2 = JSON.parse(JSON.stringify(obj1));  
obj2.a = 3;  
console.log(obj1); // { a: 1, b: 2, c: [Function: c] }  
console.log(obj2); // { a: 3, b: 2 }

还有一个就是Object.assign()

当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。

因为大部分时候我们对于后端返回的数据结构是不确定的,所以不适合用这个方法

第一级是深拷贝:
let a = {James: {age: 18}}
let b = Object.assign({}, a)
b.James = 20
console.log(b) // { James: 20 } 
console.log(a) // { James: { age: 18 } } 

以后各级是浅拷贝:
b.James.age = 20
console.log(b) // { James: { age: 20 } } 
console.log(a) // { James: { age: 20 } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值