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

js深拷贝与浅拷贝的区别(js深拷贝和浅拷贝如何实现)



浅拷贝:拷贝后,修改拷贝后的对象,会影响拷贝前的对象

深拷贝:拷贝后,修改拷贝后的对象,不影响之前的对象

浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用;深拷贝是拷贝多层,每一级别的数据都会拷贝出来

 

基本数据类型,名字和值都会储存在栈内存中。

引用数据类型,名字存在栈内存中,值存在堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值

当b=a进行拷贝时,其实复制的是a的引用地址,而并非堆里面的值。而当我们a[0]=1时进行数组修改时,由于a与b指向的是同一个地址,所以自然b也受了影响,这就是所谓的浅拷贝了。

在堆内存中也开辟一个新的内存专门为b存放值,就像基本类型那样,就可以达到深拷贝的效果了

1.直接赋值

例如数组:

 

2.循环

对象

 

3.Object.assign()

只传递了一个source参数。

 

运行结果:

4.运算符 (...)

 

 

1.使用JSON.parse(JSON.stringify(object))

 

查看运行结果:

在修改b之后,不影响a。

但是这种方法也有不少坏处,譬如它会抛弃对象的constructor。也就是深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object。

这种方法能正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,即那些能够被 json 直接表示的数据结构。RegExp对象是无法通过这种方式深拷贝。

也就是说,只有可以转成JSON格式的对象才可以这样用,像function没办法转成JSON。

 

 要复制的会直接消失,所以这个方法只能用在单纯只有数据的对象。

注意:

当转换的对象为空字符串的时候,最后结果也是空字符串

但是当内部的值为undefined时,这个不会返回正常结果,只会报错

 

结果:

 

2.

 

运行结果:

继承属性和不可枚举属性是不能拷贝的。

 

3.递归

 

4.Object.create()

直接使用var newObj = Object.create(oldObj),可以达到深拷贝的效果。

 

5.lodash的深拷贝函数  

官方中文文档:https://www.lodashjs.com/docs/lodash.cloneDeep

官方文档:https://lodash.com/docs/#cloneDeep

 

为要拷贝的值,返回拷贝后的值

这个函数会递归拷贝

 

 

 

参考:Object.assign() MDN

           js浅拷贝与深拷贝的区别和实现方式

           终于弄清楚JS的深拷贝和浅拷贝了

 

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

版权声明


相关文章:

  • vue 官网(vue 官网文档)2025-04-09 11:54:08
  • vuecli3安装失败(vue-cli3.0安装)2025-04-09 11:54:08
  • ettercap安装教程(ettercap 0.8.3.1教程)2025-04-09 11:54:08
  • jshy是哪里烟草(jhyc是哪里的烟草公司)2025-04-09 11:54:08
  • plsql注册码在哪里填(plsql14.0注册码)2025-04-09 11:54:08
  • js深拷贝方法(js深拷贝json parse)2025-04-09 11:54:08
  • pcie4.0能插pcie3.0么(硬盘pcie4.0能插pcie3.0么)2025-04-09 11:54:08
  • redhat操作系统安装(redhat7.3系统安装教程)2025-04-09 11:54:08
  • vue3插槽(vue3插槽案例)2025-04-09 11:54:08
  • jsj是什么的缩写(js是什么意思的缩写)2025-04-09 11:54:08
  • 全屏图片