對於數組的深淺拷貝


js簡單的使用數組拷貝數組

1淺拷貝bash

對於淺拷貝改變其中一個數組,另一個數組也會跟着改變函數

2深拷貝測試

 1能夠經過slice進行數組的深拷貝spa

對於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 arr1 = ["1","2","3"];
var arr2 = arr1.slice(0);
arr2[1] = "9";
console.log("數組的原始值:" + arr1 );
console.log("數組的新值:" + arr2 );
測試的結果

會出現的 ?
複製代碼
2能夠經過slice進行數組的深拷貝

concat() 方法用於鏈接兩個或多個數組。該方法不會改變現有的數組,而僅僅會返回被鏈接數組的一個副本。
語法:arrayObject.concat(arrayX,arrayX,......,arrayX)
說明:返回一個新的數組。該數組是經過把全部 arrayX 參數添加到 arrayObject 中生成的。若是要進行 concat() 操做的參數是數組,那麼添加的是數組中的元素,而不是數組。複製代碼

測試的例子指針

var arr1 = ["1","2","3"];
var arr2 = arr1.concat();
arr2[1] = "9";
console.log("數組的原始值:" + arr1 );
console.log("數組的新值:" + arr2 );

結果 ?複製代碼

js遍歷數組的方法code

var arr1 = [1,2,3];//原來數組
var arr2 = [];//新數組對象

function deepCopy(arry1, arry2){
  var length = arry1.length;
  for(var i = 0;i<length;i++){
    arry2[i] = arry1[i];
  }
}ssl

deepCopy(arr1, arr2);
arr2[0] =5;
console.log(arr1);
console.log(arr2);string


測試結果 ?


可是對於slice和concat的是有必定的侷限性

測試例子

var arr1 = [{"name":"weifeng"},{"name":"boy"}];//原數組
var arr2 = [].concat(arr1);//拷貝數組
arr1[1].name="girl";
console.log(arr1);// [{"name":"weifeng"},{"name":"girl"}]
console.log(arr2);//[{"name":"weifeng"},{"name":"girl"}]複製代碼

測試結果 ?

經過結果能夠看出來的因爲數組內部屬性值爲引用對象,所以使用slice和concat對對象數組的拷貝,整個拷貝仍是淺拷貝,拷貝以後數組各個值的指針仍是指向相同的存儲地址。

相關文章
相關標籤/搜索