如何实现数组的浅拷贝和深拷贝

1.    背景介绍

javascript分原始类型与引用类型。Array是引用类型,直接用“=”号赋值的话,只是把源数组的地址(或叫指针)赋值给目的数组,并没有实现数组的数据的拷贝。这种方式的实现属于浅拷贝。

深拷贝是开辟新的储存空间,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

2.    知识剖析

一维数组深拷贝slice和concat方法

1.  slice()

slice()语法:arrayObj.slice(start,[end])

start:必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1指最后一个元素,-2 指倒数第二个元素,以此类推。

end:可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。

返回值:返回一个新的数组,包含从start 到 end (不包括该元素)的arrayObject 中的元素(如果 end 未被规定,那么slice() 方法会选取从 start 到数组结尾的所有元素)。

2.concat()方法

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

语法:arrayObject.concat(arrayX,arrayX,......,arrayX)

说明:返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。

3. 常见问题

 jquery中数组深拷贝办法

4解决方案

jquery.extend()

语法:jQuery.extend([deep ], target, object1 [, objectN ] )

5编码实战

6.扩展思考

  slice和concat对数组深拷贝的局限性?

slice和concat这两个方法,仅适用于对不包含引用对象的一维数组的深拷贝。对于数组内部存在对象和数组,当改变对象属性和内部数组的元素后,深拷贝的数组同样也发生了改变。

 7.参考文献

JS深拷贝和浅拷贝数组

使用slice和concat对数组深拷贝和浅拷贝

8.更多讨论

讨论1:浅拷贝和深拷贝的区别

浅拷贝是指在拷贝对象时,对于基本数据类型的变量会重新复制一份,而对于引用类型的变量只是对引用进行拷贝,没有对引用指向的对象进行拷贝。而深拷贝是指在拷贝对象时,同时会对引用指向的对象进行拷贝。区别就在于是否对  对象中的引用变量所指向的对象进行拷贝。

讨论2:如何选择使用深拷贝还是浅拷贝

如果对象的属性全是基本类型的,那么可以使用浅拷贝,但是如果对象有引用属性,那就要基于具体的需求来选择浅拷贝还是深拷贝。我的意思是如果对象引用任何时候都不会被改变,那么没必要使用深拷贝,只需要使用浅拷贝就行了。如果对象引用经常改变,那么就要使用深拷贝。没有一成不变的规则,一切都取决于具体需求。

讨论3:深拷贝的其他办法

用for循环遍历复制,json.parse(),json.stringify()方法实现深拷贝。

 腾讯视频

PPT

 

欢迎加入IT修真院
IT修真院是一个免费的线上IT技术学习平台。
每个职业以15个左右的task为初学者提供更快速高效的学习方式;
所有task均是从真实项目中提炼出来的技能点
强调实战演练+自学优先+师兄辅导的学习方式
严格的日报体系,欢乐的交流讨论学习气氛,更有无数师兄师姐帮你解疑答惑。
亲,准备好加入我们这个变态成长的修真宝地了吗?
点击官网,开始自己的修真之旅吧!
入群请修改群名片,格式如下:
地区-职业-编号
职业为在修真院所学的职业
编号为入群时的群人数



猜你喜欢

转载自blog.csdn.net/cjwjyooo/article/details/80341734