1、數組的深淺拷貝數組
在使用JavaScript對數組進行操做的時候,咱們常常須要將數組進行備份,事實證實若是隻是簡單的將它賦予其餘變量,那麼咱們只要更改其中的任何一個,而後其餘的也會跟着改變,這就致使了問題的發生。函數
var arr = ["One","Two","Three"]; var arrto = arr; arrto[1] = "test"; document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,test,Three document.writeln("數組的新值:" + arrto + "<br />");//Export:數組的新值:One,test,Three
像上面的這種直接賦值的方式就是淺拷貝,不少時候,這樣並非咱們想要獲得的結果,其實咱們想要的是arr的值不變,不是嗎?
方法一:js的slice函數 this
對於array對象的slice函數, 返回一個數組的一段。(仍爲數組) arrayObj.slice(start, [end]) 參數 arrayObj 必選項。一個 Array 對象。 start 必選項。arrayObj 中所指定的部分的開始元素是從零開始計算的下標。 end 可選項。arrayObj 中所指定的部分的結束元素是從零開始計算的下標。 說明 slice 方法返回一個 Array 對象,其中包含了 arrayObj 的指定部分。 slice 方法一直複製到 end 所指定的元素,可是不包括該元素。若是 start 爲負,將它做爲 length + start處理,此處 length 爲數組的長度。若是 end 爲負,就將它做爲 length + end 處理,此處 length 爲數組的長度。若是省略 end ,那麼 slice 方法將一直複製到 arrayObj 的結尾。若是 end 出如今 start 以前,不復制任何元素到新數組中。
var arr = ["One","Two","Three"]; var arrtoo = arr.slice(0); arrtoo[1] = "set Map"; document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,Two,Three document.writeln("數組的新值:" + arrtoo + "<br />");//Export:數組的新值:One,set Map,Three
方法二:js的concat方法 prototype
concat() 方法用於鏈接兩個或多個數組。 該方法不會改變現有的數組,而僅僅會返回被鏈接數組的一個副本。 語法 arrayObject.concat(arrayX,arrayX,......,arrayX) 說明 返回一個新的數組。該數組是經過把全部 arrayX 參數添加到 arrayObject 中生成的。若是要進行 concat() 操做的參數是數組,那麼添加的是數組中的元素,而不是數組。
var arr = ["One","Two","Three"]; var arrtooo = arr.concat(); arrtooo[1] = "set Map To"; document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,Two,Three document.writeln("數組的新值:" + arrtooo + "<br />");//Export:數組的新值:One,set Map To,Three
2、對象的深淺拷貝對象
var a={name:'yy',age:26}; var b=new Object(); b.name=a.name; b.age=a.age; a.name='xx'; console.log(b);//Object { name="yy", age=26} console.log(a);//Object { name="xx", age=26}
方法一:就是把對象的屬性遍歷一遍,賦給一個新的對象。ip
function deepCopy(source) { var result={}; for (var key in source) { result[key] = typeof source[key] === 'object' ? deepCopy(source[key]) : source[key]; } return result; }
方法二:經過object原型擴展實現原型