首先提到複製,也就是拷貝問題,就必須要明確淺拷貝和深拷貝。
總的來說就是,基於引用物件的概念,淺拷貝拷貝的是位址,深拷貝直接對值進行了拷貝。
那麼在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屬性也會改...