什么是深拷贝

什么是深拷贝?

在JS中,数据类型分为基本数据类型和引用数据类型两种,对于基本数据类型来说,它的值直接存储在栈内存中,而对于引用类型来说,它在栈内存中仅仅存储了一个引用,而真正的数据存储在堆内存中。
1、数据类型分为两种

基本数据类型

var a = 3;
var b = a;
b = 5;

这就是基本数据类型

可以看到的是对于基本类型来说,我们将一个基本类型的值赋予 a 变量,接着将 a 的值赋予变量 b ;然后我们修改 b ;可以看到 b 被修改了,而 a 的值没有被修改,两个变量都使用的是独立的数据;

引用数据类型

var arr1 = {
    a:  1,
    b:  2,
    c:  3
}
var arr2 = arr1;
arr2.a = 5;
console.log(arr1.a);  // 5
console.log(arr2.a);  // 5

可以看到的是,两个对象的值全部被修改了
对象是引用类型的值,对于引用类型来说,我们将 arr1 赋值给 arr2 的时候,我们其实仅仅只是将 arr1 存储在栈堆中的的引用赋予了 arr2 ,所以当我们对其中一个进行修改的时候,会将两个值都改变

深拷贝

深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突。

深拷贝的实现

1、使用JSON.stringify()以及JSON.parse()

先转成字符串,在转回对象

 var obj1 = {
    a: 1,
    b: 2,
    c: 3
}
var objString = JSON.stringify(obj1);
var obj2 = JSON.parse(objString);
obj2.a = 5;

可以看到没有发生引用问题,修改obj2的数据,并不会对obj1造成任何影响
但是使用JSON.stringify()以及JSON.parse()它是不可以拷贝 undefined , function, RegExp 等等类型的

2、使用递归

  function copyObj(obj) {
        if (typeof obj !== "object" && !Array.isArray(obj)) {
            return obj;
        };
        let obj2;
        if (Array.isArray(obj)) {
            obj2 = [];
            obj.forEach(item => {
                obj2.push(copyObj(item));
            });
        } else if (typeof obj === "object") {
            obj2 = {}
            for (let i in obj) {
                obj2[i] = copyObj(obj[i]);
            };
        }
        return obj2;
    }
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值