当前位置:网站首页 > Vue.js开发 > 正文

js浅拷贝和深拷贝什么时候用(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)

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

到此这篇js浅拷贝和深拷贝什么时候用(js浅拷贝和深拷贝什么时候用的)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • vuecli安装完成后无法运行(vuecli3安装失败)2025-03-13 12:18:07
  • vue2生命周期面试题(vue生命周期分别做了什么)2025-03-13 12:18:07
  • 安装nodemodules命令报错安装vue-loader(vue安装node_modules)2025-03-13 12:18:07
  • redhat linux 7.2系统安装详细过程(redhat linux6.5安装教程)2025-03-13 12:18:07
  • redhat6.9重置root密码(redhat6.5重置root密码)2025-03-13 12:18:07
  • win3.2安装(win3.2安装教程)2025-03-13 12:18:07
  • ubuntu镜像iso下载(ubuntu 18.04镜像下载)2025-03-13 12:18:07
  • jsy是哪个明星(jy是哪个明星缩写)2025-03-13 12:18:07
  • 扬声器安装程序5.1(扬声器安装程序unknown怎么解决)2025-03-13 12:18:07
  • pcie5.0固态硬盘推荐(pcie5.0固态硬盘什么时候出)2025-03-13 12:18:07
  • 全屏图片