JS中数组和对象的 深复制(拷贝)与浅复制(拷贝)

JS中数组和对象的 深复制(拷贝)与浅复制(拷贝)

1.js中有五种简单的数据类型(null,string,undefined,number,boolean)和一种复杂数据类型(Object),当我们复制简单类型时,效果如下


JS中数组和对象的 深复制(拷贝)与浅复制(拷贝)_第1张图片

也就是说 当b被重新赋值时 a并不会被改变。

但是当我们复制复杂的数据类型时以数组为例 ,效果如下


JS中数组和对象的 深复制(拷贝)与浅复制(拷贝)_第2张图片

我们看到 当我们改变b的值时,a也被改变了,这显然不是我们想要的结果,所以便出现了深复制这个说法,下面以数组为例,说明一下数组深复制的方法。

2,数组的深复制

(1)for循环


JS中数组和对象的 深复制(拷贝)与浅复制(拷贝)_第3张图片

循环赋值,改变b的值 不会影响a的值,下面穿插一个知识点: 数组中循环最好不要用for in ,因为for in 循环 会循环出原型链上的内容,当数组原型链上声明了方法,我们得到的结果就不是我们想要的了。

(2)slice方法

slice方法的定义为:返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素;

重点在  返回一个 新的数组 ,也就是说不会改变原数组,也就是达到了我们的目的


JS中数组和对象的 深复制(拷贝)与浅复制(拷贝)_第4张图片

补充知识点:slice中参数为负数时,则用数组长度加上该数来确定相应的位置

(3)concat方法

concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本


JS中数组和对象的 深复制(拷贝)与浅复制(拷贝)_第5张图片

链接一个空数组还是原有数组,从而达到复制的目的,生成新的数组,不会改变原有数组

(4)ES6的 “...“ 扩展运算符 : 将一个数组转为用逗号分隔的参数序列


JS中数组和对象的 深复制(拷贝)与浅复制(拷贝)_第6张图片

3.对象的深复制

(1)for循环 实现深复制


JS中数组和对象的 深复制(拷贝)与浅复制(拷贝)_第7张图片

(2)转换成json再转换成对象


JS中数组和对象的 深复制(拷贝)与浅复制(拷贝)_第8张图片

你可能感兴趣的:(JS中数组和对象的 深复制(拷贝)与浅复制(拷贝))