js实现深拷贝和浅拷贝

1、如何分辨深拷贝和浅拷贝

简单来说,假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明是浅拷贝,如果B没变,那就是深拷贝。

2、拷贝基本数据类型与引用数据类型的区别

基本数据类型有,number,string,boolean,null,undefined,symbol以及未来ES10新增的BigInt(任意精度整数)七类。

引用数据类型(Object类)有常规名值对的无序对象{a:1},数组[1,2,3],以及函数等。

基本类型的数据存储

上图中,当你修改a=2,对b并不会造成影响,但这也算不上深拷贝,因为深拷贝本身就是针对较为复杂的Object类型数据

Object类型拷贝原理如下图:

引用数据类型的拷贝原理

3、深拷贝、浅拷贝的方法

数组的浅拷贝,除了直接赋值,可以用concat、slice返回一个新数组的特性来实现拷贝。如果数组内的项都是基本数据类型(即结构层级只有一层),也相当于深拷贝的作用。但是如果数组嵌套了对象或者数组的话,concat、slice只能深拷贝第一层级的数据项,嵌套的数据还是只能拷贝引用地址,所以这时改变复制后的值会影响原本的值,这时候就需要深拷贝。

有一种简单的方式,既能深拷贝数组也能深拷贝对象:

JSON.parse(JSON.stringify(arr))

4、JS实现深拷贝通用方法

实现思路:遍历对象,把属性和属性值都放到一个新的对象里,如果属性值也是一个对象,则再递归调用一次。

你可能感兴趣的:(js实现深拷贝和浅拷贝)