陣列的拷貝,通常可以使用乙個新的陣列,指向現有陣列
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...