大家好,我是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;
}