js 实现浅拷贝

浅拷贝与深拷贝区别

参考ConardLi的如何写出一个惊艳面试官的深拷贝

  • 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象

  • 深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象

 

 

 

总而言之,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

实现浅拷贝

1. 利用Object.assign 实现。该方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。(针对对象只有一层,没有嵌套的情况)

var obj = {name: 'zxx'};
var copy = Object.assign({}, obj)

2. 利用ES6展开运算符...实现浅拷贝

var obj = {name: 'zxx', info: {age: 1}};
var copy = {...obj};

obj.info.age = 18;
console.log(copy.info.age); // 18

3. 数组只有一层的话可以利用concat, slice 等实现;

var arr = [1,2, 3];
var arr1 = arr.concat();
var arr2 = arr.slice();

4.手动实现

function copy(obj){
    if(typeof obj === 'object' && target !== null){
        let cloneTarget = Object.prototype.toString.call(obj) === '[object Object]': {} : [];
        for(var key in obj){    
            //遍历obj,并且判断是obj的属性才拷贝
            if(obj.hasOwnProperty(key)){
                cloneTarget[key] = obj[key];
            }
        }
        return cloneTarget;
    }else {
        return obj;
    }
}

下一篇实现深拷贝

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值