最近遇到一個二維數組深拷貝的問題,原以爲和一維數組深拷貝一樣,實際上被打臉了。
於是寫了點測試代碼驗證一下,由於ts不能像c++那樣查看數組變量的地址,所以這裏使用===來判斷兩個對象是否相同(即同一個引用,內存指向同一個地址)。
代碼如下:
//一維數組深拷貝
let num1: number[] = [1,2,3,4];
let num2: number[] = num1.concat();
num2[0] = 6;
num2.push(5);
console.log("num1:" + num1);
console.log("num2:" + num2);
//二維數組“深”拷貝?
let num3: number[][] = [[1,2,3,4], [5,6,7,8]];
let num4: number[][] = num3.concat();
num4[0][0] = 6;
console.log("num3[0]:" + num3[0]);
console.log("num4[0]:" + num4[0]);
if(num1 === num2){
console.log("num1和num2是同一個引用");
}else{
console.log("num1和num2不是同一個引用");
}
if(num3[0] === num4[0]){
console.log("num3[0]和num4[0]是同一個引用");
}else{
console.log("num3[0]和num4[0]不是同一個引用");
}
輸出如下:
從輸出日誌可以看出,一維數組使用concat方法是能實現深拷貝的,但是二維數組是不行的。
我的理解:concat方法只會深拷貝一維裏面的數據,當要拷貝的數組是一維的時候,能達到我們預期的效果。當要拷貝的數組是二維的時候,由於二維數組的第一維裏面存放的是第二維數組的地址,而第二維裏面數據纔是我們要拷貝的內容。所以纔會出現上述日誌中的num3[0]和num4[0]是同一個引用的結果。
那麼要如何實現二維數組的深拷貝呢?
let num3: number[][] = [[1,2,3,4], [5,6,7,8]];
let num4: number[][] = num3.concat();
let num5: number[][] = [];
for(let index: number = 0; index < num3.length; index++){
let temp: number[] = num3[index].concat();
num5.push(temp);
}
用for循環一個個拷貝一維數組就行了。