大家好,我是IT修真院武汉分院第5期的学员朱英杰,一枚正直纯洁善良的WEB前端程序员。
1.背景介绍
在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,也就是复制、克隆或者说做拷贝
要弄明白拷贝,首先要明白js中对象的组成。在js中一切实例皆是对象,具体分为原始类型和合成类型。原始类型对象指的是number、string、boolean等,合成类型对象指的是array、object以及function。
数组的拷贝有深有浅。
2.知识剖析
浅拷贝
浅拷贝可以理解为就是复制一份来引用,所有引用对象都指向一份数据,并且都可以修改这份数据。
对于字符串类型,浅拷贝是对值的拷贝,对于对象来说,浅拷贝是对对象地址的拷贝,也就是复制
的结果是两个对象指向同一个内存地址,修改其中一个对象的属性,则另一个对象的属性也会改变
深拷贝
深拷贝则是复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。
深复制不同于浅复制,它会开辟新的内存地址,两个对象对应两个不同的地址,修改
一个对象的属性,不会改变另一个对象的属性.,深复制会带来性能上的问题。在遇到需要采用深拷贝的场景时,可以考虑有没有其他替代的方案。在实际的应用场景中,也是浅拷贝更为常用
方法一: 用js的slice函数来实现
var arr = ["One","Two","Three"];
var arrtoo = arr.slice(0);
arrtoo[1] = "set Map";
document.writeln("数组的原始值:" + arr + "
");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtoo + "
");//Export:数组的新值:One,set Map,Three
方法二:用js的concat方法
var arrtooo = arr.concat();
arrtooo[1] = "set Map To";
document.writeln("数组的原始值:" + arr + "
");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtooo + "
");//Export:数组的新值:One,set Map To,Three
3.常见问题
如何实现深拷贝和浅拷贝
4.解决方案
浅拷贝
var arr = ["One","Two","Three"];
var arrto = arr;
arrto[1] = "test";
document.writeln("数组的原始值:" + arr + "
");//Export:数组的原始值:One,test,Three
document.writeln("数组的新值:" + arrto + "
");//Export:数组的新值:One,test,Three
深拷贝
方法一: 用js的slice函数来实现
var arr = ["One","Two","Three"];
var arrtoo = arr.slice(0);
arrtoo[1] = "set Map";
document.writeln("数组的原始值:" + arr + "
");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtoo + "
");//Export:数组的新值:One,set Map,Three
方法二:用js的concat方法
var arrtooo = arr.concat();
arrtooo[1] = "set Map To";
document.writeln("数组的原始值:" + arr + "
");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtooo + "
");//Export:数组的新值:One,set Map To,Three
5.编码实战
6.扩展思考
angular如何实现数组的浅拷贝和深拷贝
使用AngularJS开发项目的我们,往往忽视了angularjs封装好的一系列方法,比如angular.isString(),angular.isNumber(),angular.isArray(),angular.isFunction()来判断各种类型,在这些angular封装好的方法中,其中有一个叫做angular.copy()
它是用来实现深拷贝的一个方法,可以直接用这个方法深拷贝
对象,数组,undefined,null等类型,很强大,
var a=[1,2,3];
var b=angular.copy(a);
var c={
name:"Jill",
age:20
};
var d=angular.copy(c);
7.参考文献
参考:数组的拷贝
问题:还有哪些方法实现深拷贝
对象的深浅拷贝,就是把对象的属性遍历一遍,赋给一个新的对象。
vardeepCopy=function(source) {
var result={};
for(varkeyinsource) {
result[key]= typeof source[key]===’object’? deepCoyp(source[key]):source[key];
}returnresult;
}