因為javascript分原始類型與引用類型(與java、c#類似)。Array是引用類型,所以直接用=號賦值的話,只是把源數組的地址(或叫指針)賦值給目的數組,並沒有實現數組的數據的拷貝。另外對一維數組和多維數據的深拷貝實現方式是不一樣的,下面分別討論。
一、 錯誤實現
var array1 = new Array("1","2","3"); var array2; array2 = array1; array1.length = 0; alert(array2); //返回為空
這種做法是錯的,因為javascript分原始類型與引用類型(與java、c#類似)。Array是引用類型。array2得到的是引用,所以對array1的修改會影響到array2。
二、 一維數組的實現方式:
使用slice() 或者 concat()來實現一維數組的深拷貝,但這種方法只適用於一維數組,對多維數組無效。
可使用slice()進行復制,因為slice()返回也是數組。
var array1 = new Array("1","2","3"); var array2; array2 = array1.slice(0); array1.length = 0; alert(array2); //返回1、2、3
注意concat()返回的並不是調用函數的Array,而是一個新的Array,所以可以利用這一點進行復制。
var array1 = new Array("1","2","3"); var array2; array2 = array1.concat(); array1.length = 0; alert(array2); //返回1、2、3
三、 多維數組的JS函數實現方式:
function deepcopy(obj) { var out = [],i = 0,len = obj.length; for (; i < len; i++) { if (obj[i] instanceof Array){ out[i] = deepcopy(obj[i]); } else out[i] = obj[i]; } return out; } //下面是測試代碼 var weekArray = new Array(7);//數組第一維 var timeTableArray = new Array(); //數組第二維 var lineArray = new Array(4); //數組第三維 lineArray[0] = "1_a"; lineArray[1] = "1_b"; lineArray[2] = "1_c"; timeTableArray.push(lineArray); weekArray[0] = deepcopy(timeTableArray); //清空,並添加其他星期的數據 lineArray.splice(0,lineArray.length); timeTableArray.splice(0,timeTableArray.length); lineArray[0] = "7_a"; lineArray[1] = "7_b"; lineArray[3] = "7_d"; timeTableArray.push(lineArray); weekArray[7] = deepcopy(timeTableArray); alert("weekArray=" + weekArray[0]);//返回 "1_a,1_b,1_c," alert("weekArray=" + weekArray[7]);//返回 "7_a,7_b,,7_d"
四、 多維數組的jquery實現方式:
把上述的deepcopy函數用下面的函數替代即可
weekArray[0] = $.extend(true, {}, timeTableArray);
來源:http://www.cnblogs.com/matthew-2013/p/3524297.html