2025年js深拷贝(js深拷贝和浅拷贝的区别)

js深拷贝(js深拷贝和浅拷贝的区别)JavaScript 数据类型包括基本数据类型 Number String boolean Null Undefined Symbol 引用数据类型 Array Object 基本数据类型的特点 直接存储在栈 stack 中的数据 引用数据类在栈中存有指针 实体数据存在堆中 通过栈中的指针找到堆中的引用数据类型的实体 浅拷贝只复制指向某个对象的指针 而不复制对象本身

大家好,我是讯享网,很高兴认识大家。



JavaScript数据类型包括基本数据类型(Number,String,boolean,Null,Undefined,Symbol)、引用数据类型(Array,Object)

  • 基本数据类型的特点:直接存储在栈(stack)中的数据
  • 引用数据类在栈中存有指针,实体数据存在堆中,通过栈中的指针找到堆中的引用数据类型的实体

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。

浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。

image
讯享网

image

上面例子中,obj1是原始数据,obj2是赋值操作得到,而obj3浅拷贝得到。我们可以很清晰看到对原始数据的影响,具体请看下表:

image

Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。

对于Object.assign()而言,如果对象的属性值为简单类型(string,number),通过Object.assign({},srcobj);得到的新对象为深拷贝;如果属性值为对象或其他引用类型,那对于这个对象而言其实是浅拷贝

image

image

原理: 用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。

这种方法虽然可以实现数组或对象深拷贝,但不能处理函数。

这是因为 JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串,不能接受函数

更多关于js深拷贝与浅拷贝的文章请查看下面的相关链接

小讯
上一篇 2025-05-10 13:30
下一篇 2025-06-07 14:46

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/154087.html