JS中的陣列複製問題

2022-08-21 01:18:16 字數 1958 閱讀 8979

首先提到複製,也就是拷貝問題,就必須要明確淺拷貝和深拷貝。

總的來說就是,基於引用物件的概念,淺拷貝拷貝的是位址,深拷貝直接對值進行了拷貝

那麼在js的陣列中,哪些複製是淺拷貝的?哪些又是深拷貝的呢?這裡做乙個學習總結。

let arr1 = [2,3,4,5,6];

let arr2 = arr1;

arr2.push(12);

console.log(arr1); //[2, 3, 4, 5, 6, 12]

console.log(arr2); //[2, 3, 4, 5, 6, 12]

可以看到通過賦值符號 「=」 複製是淺拷貝。

擴充套件陣列屬於引用資料型別,那麼我們可以猜測,通過 賦值符號 「=」 賦值的引用資料型別的變數的複製都是淺拷貝,驗證如下:

let obj1 = ;

let obj2 = obj1;

obj2.value = 12;

console.log(obj1); //

console.log(obj2); //

那麼值(基礎)資料型別呢?

let num1 = 23;

let num2 = num1;

num2 = 12;

console.log(num1); //23

console.log(num2); //12

可以看到基礎資料型別通過賦值符號 「=」 的複製是深拷貝的,但要注意,如果你通過物件的方式進行定義的話,那麼基礎資料型別也會變成物件,物件的直接複製僅僅只複製了位址。

let num1 = new number(23);

let num2 = num1;

num2 = 12;

console.log(num1); //23

console.log(num2); //12

我們知道,js提供了很多陣列複製的方法,例如拆分操作符(...),map函式,concat函式,slice函式,這些方法都可以進行陣列的複製,那麼今天就一起總結下哪些複製是淺拷貝的,哪些是深拷貝的。

let arr1 = [2,3,4,5,6];

arr2 = [...arr1];

arr2.shift();

console.log(arr1); //[2, 3, 4, 5, 6]

console.log(arr2); //[3, 4, 5, 6]

可以看到通過拆分操作符進行的複製是深拷貝的,arr2指向的是乙個新的位址

let arr1 = [2,3,4,5,6];

arr2 = arr1.map(item=>item);

arr2.shift();

console.log(arr1); //[2, 3, 4, 5, 6]

console.log(arr2); //[3, 4, 5, 6]

let arr1 = [2,3,4,5,6];

arr2 = arr1.concat();

arr2.shift();

console.log(arr1); //[2, 3, 4, 5, 6]

console.log(arr2); //[3, 4, 5, 6]

let arr1 = [2,3,4,5,6];

arr2 = arr1.slice();

arr2.shift();

console.log(arr1); //[2, 3, 4, 5, 6]

console.log(arr2); //[3, 4, 5, 6]

經過驗證,拆分操作符(...),map函式,concat函式,slice函式的複製均為深拷貝。

python numpy陣列中的複製問題

vector numpy.array 5,10,15,20 equal to ten or five vector 10 vector 5 vector equal to ten or five 50 print vector 第一次看到這個的時候一臉懵逼,後來分析了下懂了下面記錄下,方便下次看看 ...

Numpy陣列的複製問題

本作者最近開始初學python,用部落格記錄一些在學習過程中遇到的問題和大家進行分享,希望能夠越來越好。在原來使用array的陣列切片工具能夠輕鬆的獲得乙個list的複製,但是在numpy中使用array 是不能夠辦到這個事情,要想處理資料的時候能夠不更改原始的array object 則需要使用標...

js中的深複製與淺複製

二者的區別 深複製只複製物件的值,在複製後指向不同的位址,但兩個物件的值相同 淺複製複製的是物件的位址,在複製後指向同乙個位址,兩個物件的位址與值都相同 淺複製 let a let b a console.log a console.log b 如果改變b的name屬性,會發現a的name屬性也會改...