JS陣列的深淺轉殖

2021-09-03 08:17:56 字數 2019 閱讀 2831

陣列的拷貝,通常可以使用乙個新的陣列,指向現有陣列

var arr = ['liuche', 'zhouyafu', 'huoqubing', 'weiqing'];

var arr2 = arr;

arr2.push('liguang');

alert(arr); // 'liuche', 'zhouyafu', 'huoqubing', 'weiqing', 'liguang'

alert(arr2); // 'liuche', 'zhouyafu', 'huoqubing', 'weiqing', 'liguang'

這裡我們看到,待修改陣列arr2時,arr同時做了改變,這顯然不是我們想要的結果。

示例中,這種直接將陣列引用複製的方式就是淺拷貝。

那我們想要對陣列進行備份的話,該如何操作呢,可以借助於array物件的slice()方法和concat()方法。

slice方法

var arr = ['liuche', 'zhouyafu', 'huoqubing', 'weiqing'];

var arr2 = arr.slice(0);

arr2.push('liguang');

alert(arr); // 'liuche', 'zhouyafu', 'huoqubing', 'weiqing'

alert(arr2); // 'liuche', 'zhouyafu', 'huoqubing', 'weiqing', 'liguang'

但是,如果遇到多維陣列,slice方法並不奏效

var arr = [['liuche', 'zhouyafu', 'weiqing'], ['chengajiao', 'weizifu', 'liupiao']];

var arr2 = arr.slice(0);

arr2[0][3] = 'liguang';

alert(arr); // liuche,zhouyafu,weiqing,liguang,chengajiao,weizifu,liupiao

alert(arr2); // liuche,zhouyafu,weiqing,liguang,chengajiao,weizifu,liupiao

concat方法

該方法不會改變現有的陣列,而僅僅會返回被連線陣列的乙個副本。

var arr = [['liuche', 'zhouyafu', 'weiqing'], ['chengajiao', 'weizifu', 'liupiao']];

var arr2 = arr.concat();

arr2[0][3] = 'liguang';

alert(arr); // liuche,zhouyafu,weiqing,liguang,chengajiao,weizifu,liupiao

alert(arr2); // liuche,zhouyafu,weiqing,liguang,chengajiao,weizifu,liupiao

經過上面的例子和分析,可以看出來,簡單陣列的拷貝可以通過slice方法和concat方法來實現

乙個萬能的js拷貝方法,無論是陣列還是物件均可以實現深拷貝

var arr = [['liuche', 'zhouyafu', 'weiqing'], ['chengajiao', 'weizifu', 'liupiao']];

var arr2 = json.parse(json.stringify(arr));

arr2[0][3] = 'liguang';

alert(arr); // liuche,zhouyafu,weiqing,chengajiao,weizifu,liupiao

alert(arr2); // liuche,zhouyafu,weiqing,liguang,chengajiao,weizifu,liupiao

對於多維陣列的實現,必須通過json.parse(json.stringify(obj))方法來實現。

陣列 物件的轉殖(包括深 淺轉殖)

let arr1 3,4,5,6,let arr2 arr1.concat arr2 0 110 arr2 4 user liu console.log arr1 3,4,5,6,裡面的物件跟著改變了 console.log arr2 110,4,5,6,let arr1 3,4,5,6,let a...

js物件深淺轉殖及封裝

1.淺轉殖 var obj1 var obj2 obj1 因為obj1 和 obj2 共用乙個位址,回到資料修改的時候彼此出現影響 obj1.a 20 console.log obj2 202.深轉殖 var obj1 var obj2 轉殖 你有什麼我有什麼 先去找到原物件裡面每乙個項資料 for...

js 陣列物件的淺轉殖

如果再考慮更奇葩更複雜的情況,例如我們定義 var obj b 2 c 這是乙個由物件 陣列雜合成的奇葩陣列,雖然我們平時寫程式基本不可能這麼折騰自己,但是可以作為一種特殊情況來考慮,這樣我們就可以結合之前說的方法去拓展拷貝函式 var objdeepcopy function source for...