首页 » 前端 » 正文

js的深拷贝和浅拷贝

深拷贝和浅拷贝最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用,
1)深拷贝在计算机中开辟了一块内存地址用于存放复制的对象,
2)而浅拷贝仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。

这是个极其简单的例子,深浅拷贝一个最大的表征就是,使用的变量是否受到它原始变量的影响(这个说法不官方哈)

另外,js有以下两种数据类型:

基本类型:Number Boolean  String  undefined null

引用类型:Object  Function

有人说,基本数据类型复制都是深拷贝,引用类型都是浅拷贝,这个说法还是有问题的,后半句不全面,比如:

test1去改变引用的值,test2去赋值。

拷贝有很多的业务场景,算是一种复用,网上也有很多介绍,就不多说了,我个人理解的他们在应用场景上的不同,主要是看业务中对你拷贝的数据的可操作性,如果只是一种展示,那么浅拷贝就行,如果有后续的修改或删除,那就要深拷贝了。

下面就针对两种引用类型的深拷贝进行说明

数组

1、通过 Array.from

2、通过 ES6 的解构赋值

3、通过 concat

4、通过splice

5、map,可以返回数组的遍历

6、split、join

7、小算法

对象

1、JSON-api

2、Object.assign()拷贝

3、递归算法

4、jQuery的extend

5、lodash函数库实现深拷贝
lodash很热门的函数库,提供了 lodash.cloneDeep()实现深拷贝

先总结这些吧,如果以后发现更多方法再回来更新~

参考:

https://segmentfault.com/a/1190000012828382
https://www.jianshu.com/p/0d7bd31ccf43