JS中数组和对象的 深复制(拷贝)与浅复制(拷贝)
1.js中有五种简单的数据类型(null,string,undefined,number,boolean)和一种复杂数据类型(Object),当我们复制简单类型时,效果如下
也就是说 当b被重新赋值时 a并不会被改变。
但是当我们复制复杂的数据类型时以数组为例 ,效果如下
我们看到 当我们改变b的值时,a也被改变了,这显然不是我们想要的结果,所以便出现了深复制这个说法,下面以数组为例,说明一下数组深复制的方法。
2,数组的深复制
(1)for循环
循环赋值,改变b的值 不会影响a的值,下面穿插一个知识点: 数组中循环最好不要用for in ,因为for in 循环 会循环出原型链上的内容,当数组原型链上声明了方法,我们得到的结果就不是我们想要的了。
(2)slice方法
slice方法的定义为:返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素;
重点在 返回一个 新的数组 ,也就是说不会改变原数组,也就是达到了我们的目的
补充知识点:slice中参数为负数时,则用数组长度加上该数来确定相应的位置
(3)concat方法
concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本
链接一个空数组还是原有数组,从而达到复制的目的,生成新的数组,不会改变原有数组
(4)ES6的 “...“ 扩展运算符 : 将一个数组转为用逗号分隔的参数序列。
3.对象的深复制
(1)for循环 实现深复制
(2)转换成json再转换成对象