js中深拷贝与浅拷贝的区别

js中变量包含两种数据类型 基本数据类型和引用数据类型

浅拷贝的小例子

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

在这里插入图片描述
b复制了a,修改数组a,数组b也跟着变了,

a,如果我们
let a = 1 ; 当你 b = a 的时候 栈内存会开辟一个内存 不会互相影响

b, 如果我们
let a = [1,2,3,4] 当你b=a 的时候 实在复制a的 引用地址
当我们a[0]=1 由于a和b指向的一个地址 b也会跟着修改 这就是 所谓的浅拷贝

c, 如果我们
在内存中 也来开辟一个新的内容 来存放b的值 也就是我们所说的深拷贝

一个深拷贝的函数

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],
b=deepClone(a);
a[0]=2;
console.log(a,b);

在这里插入图片描述

现在b脱离了a的控制 不再受a影响

除了递归,我们还可以借用JSON对象的parse 和stringify

function deepClone(obj){
let _obj = JSON.stringify(obj),
    objClone = JSON.parse(_obj);
return objClone
}    
let a=[0,1,[2,3],4],
b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);

在这里插入图片描述

JSON.stringify 与JSON.parse 除了实现深拷贝 还能结合 localStorage实现对象数组存储

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值