js中的浅拷贝和深拷贝

1.简单理解

把a拷贝给b,浅拷贝会把a的引用(地址)赋值给b,深拷贝会在内存中新建一个对象,然后把a的属性在新创造的对象中生成一份。

2.js中的数据类型

js中有基本数据类型和引用数据类型。基本数据类型有字符串、数字、布尔、空、未定义、Symbol和BigInt,引用数据类型有Object,包含日期、数组、函数等。基本数据类型大小是固定的,引用数据类型的可变的,分别存放在内存中的两种存储结构(后入先出)和。堆是动态分配内存,内存大小不一,也不会自动释放。栈是自动分配相对固定大小的内存空间,并由系统自动释放。

因此js中的基本数据类型存放在栈中,js中的引用数据类型的地址存储在栈中,访问引用类型数据时首先从栈中获取该数据的地址,在堆中按照这个地址获取所需数据。

3.举例

举例:

1.对于基本数据类型的数据

let a=1

a1

接着执行let b=a,b复制a的值,栈内存会新开辟一个内存给b

a1
b1

此时b已经有了独立空间,a改变时不会影响b.可以打开控制台进行验证

let a =1
//undefined
let b=a
//undefined
a=2
//2
b
//1
a
//2

虽然b不受a影响,但这也算不上深拷贝.

2.对于基本数据类型的数据

深拷贝和浅拷贝是针对引用类型数据的.

浅拷贝:

let a=[0,1,2,3],
b=a;
console.log(a===b);
a[0]=1;
console.log(a,b);
//输出结果
true
(4) [1, 1, 2, 3] (4) [1, 1, 2, 3]
//对于浅拷贝,修改a中的值,b中的值也会跟着改变

在这里插入图片描述

在这里插入图片描述

当使用a[0]=1进行数组修改时,由于a与b指向的是同一个地址,所以b也受影响,这也就是浅拷贝。

在这里插入图片描述

在实际开发中,深拷贝是非常有用的。例如后台返回了一堆数据,你需要对这堆数据做操作,但在多人开发情况下,你是没办法明确这堆数据是否有其它功能也需要使用,直接修改可能会造成隐性问题,深拷贝能帮你更安全安心的去操作数据,可以根据实际情况来使用深拷贝。

深拷贝:

递归方式实现深拷贝:

hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。

function deepClone(obj) {
    let target = {};
    for(let key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
            if (typeof obj[key] === 'object') {
                target[key] = deepClone(obj[key]); 
            } else {
                target[key] = obj[key];
            }
        }
    }
    return target;
}

json方式实现深拷贝

stringify() → JavaScript对象序列化为JSON字符串

parse() → 把JSON字符串解析为原生JavaScript值

function (obj) {
    let tmp = JSON.stringify(obj); 
    let result = JSON.parse(tmp); 
    return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值