超级全面-深拷贝与浅拷贝的实现方式

一.数据类型:

(1)基本数据类型:number,string,Boolean,null,undefined,symbol(ES6),BigInt(ES10);

(2)引用数据类型:对象,数组,函数等;

引用数据类型的存储:名存于栈,值存于堆;栈内存会提供一个引用的地址指向堆内存中的值。

二.用实例来看深浅拷贝:

(1)浅拷贝:

a = [1, 2, 3, 4]   b = a;进行拷贝操作的时候,复制的是a的引用地址,不是堆里面的值;

a[0] = 0;对数组a进行修改操作,a,b指向的是同一个地址,b的值也被修改了。这种情况属于浅拷贝;

(2)深拷贝:

如果在堆内存中,也开辟一个新的内存专门来存放b的值,这就可以达到深拷贝的效果;

深拷贝会拷贝所有层级的属性;

三.深拷贝的实现方式:

(1)递归复制所有层级的属性:

function deepClone(obj){
    let objClone = Array.isArray(obj)?[]:{};
    if(obj && typeof obj==="object"){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                //判断ojb子元素是否为对象,如果是,递归复制
                if(obj[key]&&typeof obj[key] ==="object"){
                    objClone[key] = deepClone(obj[key]);
                }else{
                    //如果不是,简单复制
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
}   
let a = [1,2,3,4]
let b = deepClone(a);
a[0] = 2;
console.log(a,b);

(2)slice实现拷贝:

let a = [1,2,3,4]
let b = a.slice();
a[0] = 2;
console.log(a, b);

上述代码中,修改a之后,并没有影响b;

let a = [0,1,[2,3],4]
let b = a.slice();
a[0] = 1;
a[2][0] = 1;
console.log(a,b);

但是在上述代码中,对a的一级属性进行修改,并没有影响b,但是二级修改,却影响了b;

(3)JSON对象的parse和stringify

let a = [0,1,[2,3],4]
let b=JSON.parse(JSON.stringify(a));
a[0]=1;
a[2][0]=1;
console.log(a,b);

(4)Object.assign()

let obj = {a: 1, b: 2}
let objCopy = Object.assign({}, obj)
console.log(objCopy)
obj.a = 6;
console.log(obj)
console.log(objCopy)

同slice,当只有一级属性的时候属于深拷贝;但是二级属性,同样会影响拷贝后的objCopy :

let obj = {a: 1, b: {name: 'll'}}
let objCopy = Object.assign({}, obj)
console.log(objCopy)
obj.b.name = 'dd';
console.log(obj)
console.log(objCopy)

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Delicia_Lani

你的鼓励将是我写作的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值