百科狗-知识改变命运!
--

js实现深拷贝,js如何实现深拷贝和浅拷贝

百变鹏仔1年前 (2023-11-26)阅读数 24#技术干货
文章标签js实现深拷贝

JS传值和传址问题(JS深拷贝)

处理这个问题涉及到JS中的深拷贝,JS的深拷贝会为新的变量重新申请一个新的地址块,不会指向原变量的地址,如何实现深拷贝,以下提供js实现深拷贝了两种方法。

浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。

传值js实现深拷贝:实际复制的是值,存在两个不同的、独立的拷贝;传址:复制的只是对值的引用。如果通过这个新的引用修改了值,则这个改变对最初的引用来说也可见。

在 JavaScript 中,深拷贝和浅拷贝的区别在于是否真正获取一个对象的复制实体,而不是引用。

浅拷贝:也叫引用拷贝,公用一块内存地址,一个改变另一个也改变;深拷贝:创建新的内存地址保存值,与原对象完全独立。

JS中实现深拷贝的几种方法(object,Array)

有效的对象拷贝应该是指深拷贝。浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变!深拷贝:就是重新复制一块内存,这样就不会互相影响。

type函数 首先我们要实现一个getType函数对元素进行类型判断,关于元素的类型判断,可以参考我另一篇博文 js中typeof和instanceof详解 ,这里用一个更简便的方法,直接调用Object.prototype.toString 方法。

Object.assign(target, source) 将一个或多个可枚举对象的可枚举属性复制到 target 对象,返回 target 对象。

首先我们了解下两种 数据类型 : 基本类型:像Number、String、Boolean等这种为基本类型 复杂类型:Object和Array 接着我们分别来了解下浅拷贝和深拷贝,深拷贝和浅拷贝是只针对Object和Array这样的复杂类型的。

处理这个问题涉及到JS中的深拷贝,JS的深拷贝会为新的变量重新申请一个新的地址块,不会指向原变量的地址,如何实现深拷贝,以下提供了两种方法。

js实现深拷贝的几种方法

有效的对象拷贝应该是指深拷贝。浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变!深拷贝:就是重新复制一块内存,这样就不会互相影响。

我们通常使用JSON.parse(JSON.stringify(object))来解决:但是该方法具有以下局限性:遇到函数、undefined和symbol时,会直接忽略掉他们,该对象不能正常的序列化,此时我们需要实现一个更为完善的深拷贝。

处理这个问题涉及到JS中的深拷贝,JS的深拷贝会为新的变量重新申请一个新的地址块,不会指向原变量的地址,如何实现深拷贝,以下提供了两种方法。

首先我们要实现一个getType函数对元素进行类型判断,关于元素的类型判断,可以参考我另一篇博文 js中typeof和instanceof详解 ,这里用一个更简便的方法,直接调用Object.prototype.toString 方法。

JS怎么做才算是深拷贝

1、浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。

js实现深拷贝,js如何实现深拷贝和浅拷贝

2、并没有改变,m对象和n对象是虽然所有的值都是一样的,但是在堆里面,对应的不是同一个了,这个就是深拷贝。

3、深拷贝:创建新的内存地址保存值,与原对象完全独立。

4、当我们想复制一个对象并且切断与这个对象的联系,就要使用深拷贝。

5、有效的对象拷贝应该是指深拷贝。浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变!深拷贝:就是重新复制一块内存,这样就不会互相影响。

JS面试题:深浅拷贝简析/手写深拷贝函数

首先我们可以通过Object.assign来实现浅拷贝,该函数只会拷贝所有的属性值到新的对象中,如果属性值是对象的话,拷贝的是地址,即为浅拷贝而不是深拷贝。

在 JavaScript 中,深拷贝和浅拷贝的区别在于是否真正获取一个对象的复制实体,而不是引用。

console.log(Object.assign(a,b,c));//{ a: 1, b: 2, c: 3 } 浅拷贝:也叫引用拷贝,公用一块内存地址,一个改变另一个也改变;深拷贝:创建新的内存地址保存值,与原对象完全独立。

浅拷贝:复制一份引用,所有引用对象都指向一份数据,并且都可以修改这份数据。深拷贝(复杂):复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。

浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)