js深淺拷貝

2021-10-20 20:14:42 字數 1927 閱讀 3268

1.什麼是深淺拷貝

簡單的來說,加入b複製a ,a改變 , 如果b也跟著改變的話,那就是淺拷貝,反之是深拷貝

實現淺拷貝方法:

1.賦值操作

var a =[0

,1,2

,3,4

]var b = a a[0

]=5console

.log

(a)// [5,1,2,3,4]

console

.log

(b)// [5,1,2,3,4]

2. es6 object.

assign()

只能可以拷貝一層資料,無法拷貝多層資料,內層依然為淺拷貝

var obj =};

var initalobj = object.

assign

(, obj)

;initalobj.a.a =

"changed"

;console

.log

(obj.a.a)

;// "changed"

3.es6 提供的展開運算子:

let foo =

, num:

nan,

empty:undefined

}}let now =

;console

.log

(foo)

;// }}

console

.log

(now)

;// }}

實現深拷貝方法

let obj1 =]}

}let obj2 =

json

.parse

(json

.stringify

(obj1));

//通過json的方式對資料進行處理轉換時, 不是改變原資料, 而是在記憶體中開闢乙個新空間來儲存轉換的資料,

//這樣兩次轉換後, 返回的資料 ,與原資料內容相同但是儲存位址不同, 不存在引用關係

// 深拷貝成功

obj1.title.name =

'張三'

;console

.log

(obj1,obj2)

; obj1 改變 obj2 不變

注意:

當concat 和slice 為一維陣列時,為深拷貝, 多維陣列時又為淺拷貝,

所以說這兩者為深拷貝又不是很對

var arr1 =

['red'

,'green'];

var arr2 = arr1.

concat()

;//複製

console

.log

(arr2)

//['red','green'];

arr1.

push

('black');

//改變color1的值

console

.log

(arr2)

//["red", "green"]

console

.log

(arr1)

//["red", "green", "black"]

var arr1=[1

,2,3

,['1',

'2',

'3']];

var arr2=arr1.

concat()

; arr1[3]

[0]=

0;console

.log

(arr1)

;//[1,2,3,['0','2','3']]

console

.log

(arr2)

;//[1,2,3,['0','2','3']]

JS深 淺拷貝

在js中,資料型別分為基本資料型別和引用資料型別兩種。對於基本資料型別來說,它的值直接儲存在棧記憶體中,而對於引用型別來說,它在棧記憶體中只是儲存了乙個指向對記憶體的引用,而真正的資料儲存在堆記憶體中。object array 這兩個就是引用型別,當我門直接去拷貝的話 copyobj obj 拷貝的...

js 深淺拷貝

深拷貝就是複製內部內容 淺拷貝就是複製記憶體位址 var obj 淺拷貝 引用傳遞 淺拷貝就是賦值,將鑰匙複製乙份 var o obj 深拷貝 內部內容複製乙份 將房子複製乙份 方法一 var str json stringify obj var obj3 json parse str 方法二 va...

JS深淺拷貝

1.淺拷貝 將原物件或原陣列的引用直接賦給新物件,新陣列,新物件 陣列只是原物件的乙個引用 2.深拷貝 建立乙個新的物件和陣列,將原物件的各項屬性的 值 陣列的所有元素 拷貝過來,是 值 而不是 引用 使用深拷貝的場景 在改變新的陣列 物件 的時候,不改變原陣列 物件 1.for迴圈遍歷陣列 var...