首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js浅拷贝和深拷贝以及注意事项

JavaScript有两种数据类型,基础数据类型和引用数据类型。基础数据类型都是按值访问的,我们可以直接操作保存在变量中的实际的值。而引用类型如Array,我们不能直接操作对象的堆内存空间。引用类型的值都是按引用访问的,即保存在变量对象中的是一个地址,该地址与堆内存的实际值相关联

1. 浅拷贝原理

浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用(地址),所以改变新对象,旧对象也会改变,因为新旧对象共享一块内存。浅拷贝的方法实现代码如下:

Object.assign(目标, 源数据)

注意:当对象只有一级属性为深拷贝,当对象中有多级属性时,二级属性后就是浅拷贝

下面的案例中我们使用Object.assign进行拷贝时会有意向不到怪想:

var obj = {

id: 1,

name: 'andy',

msg: {

age: 18

}

};

var copy1 = {};

Object.assign(copy1, obj);

console.log(copy1)

上面我们已经通过Object.assign将obj拷贝到copy1中,现在我们对copy1的name值进行修改:

copy1.name = '测试';

console.log(copy1,obj)

//打印结果:

// { "id": 1, "name": "测试", "msg": { "age": 18 } }

// {"id": 1,"name": "andy","msg": {"age": 18}}

从打印结果来看,修改copy1的name属性后没有改变原对象的值,这不就变成是深拷贝。但是如果我们对二级属性msg.age进行修改:

copy1.msg.age = 1111;

console.log(copy1,obj)

//打印结果:

// { "id": 1, "name": "测试", "msg": { "age": 1111 } }

// {"id": 1,"name": "andy","msg": {"age": 1111}}

从打印结果可以看出,二级属性被修改后原对象的二级属性也被修改了,这时Object.assign就变成了浅拷贝

2. 深拷贝原理

复制并创建一个一模一样的对象,不共享内存,修改新对象,旧对象保持不变。

对于深拷贝最快的实现方式就是通过JSON类将对象转成json字符串再反转成新的对象,具体代码如下:

let new_obj = JSON.parse(JSON.stringify('待复制的对象'));

3. 深拷贝与浅拷贝的区别

浅拷贝:只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存。

深拷贝:复制并创建一个一模一样的对象,不共享内存,修改新对象,旧对象保持不变。

4. structuredClone实现深拷贝

structuredClone 是一个新的深度拷贝方法,使用起来简单,结果也是同步返回:

var obj_copy = structuredClone(obj)

注意:它的兼容性还不太理想,使用时需要先测试一下网站支持的浏览器版本是否足够

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O8p-RPzgjejUSDr4khM6RURg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券