js的原始值、引用值
拷貝針對的是引用型別物件,例如object、array等
簡單來說就是淺拷貝是只是複製物件的引用,值還是共享一塊記憶體,原值和複製物件值會相互影響。
深拷貝,是徹底的賦值物件的值,而不是物件的引用,彼此間不會相互影響(相當於重新創造乙個值,類似於原始值的操作)。
賦值的時候一定要注意是堆的賦值還是變數的賦值,如果是在函式內定義的新物件,要注意每呼叫一次函式,裡面的物件都是乙個新值都會重新指向乙個新的記憶體。
(對第一層的資料進行了拷貝處理,再深一點的層級修改仍然會影響到資料)
1、object.assign()
let demo =
}let clone_demo = object.
assign
(, demo)
demo.name = 『yanyan』
demo.con.aa = 『aaa』
console.
log(clone_demo.name,clone_demo.con.aa)
// yanyan you
2、展開運算子…let demo =
}let clone_demo =
demo.name = 『yanyan』
console.
log(clone_demo.name)
// yanyan
3、函式實現function
******clone
(initalobj)
;// 重新的乙個堆位址
for(
var i in initalobj)
return obj;
}
(僅初次完全複製內容)
使用json.parse、json.stringify實現陣列的拷貝
deepclone
(obj)
,let demo =
}let clone_demo =
deepclone
(demo)
demo.name = 『yanyan』
console.
log(clone_demo.name)
// yan 不會修改拷貝後的值
注意:會忽略undefined symbol
不能序列化函式
如果資料有null會考成空物件
不能解決迴圈引用的物件
不能正確處理 new
date()
不能處理正則
遞迴實現//使用遞迴的方式實現陣列、物件的深拷貝
function
deepclone1
(obj)
;//進行深拷貝的不能為空,並且是物件
if(obj &&
typeof obj ===
"object")}
}return objclone;
}
第二種深拷貝// 保留陣列 並且判斷是不是null
letisobject
= obj =>
typeof obj ===
'object'
&& obj !==
null
;let
shallowclone2
= source =>
for(
let key in source)
}return target
}let demo =
, h1 :
null
, h2 :[1
,2,3
], h3 : undefined }
let clone_demo =
shallowclone2
(demo)
; console.
log(clone_demo)
; demo.name = 'new
name』
demo.book.price = '100』
demo.h2[1]
= 'new
data』
console.
log(clone_demo.name,clone_demo.book.price)
// dayday 45
console.
log(clone_demo)
;// 修改demo值為能影響clone_demo
對深拷貝及淺拷貝的理解
1.兩個拷貝之間區別主要是用於物件資料之間的拷貝!2.區別 沒指標 深拷貝和淺拷貝沒什麼區別 有指標 淺拷貝 即物件的預設拷貝函式,只是將指標的位址拷貝給物件,兩個變數同時指向乙個位址,這樣在析構的時候必然會導致程式崩潰 class a a protected private char m data...
淺拷貝,深拷貝的理解
淺拷貝 淺拷貝是將物件的每個屬性進行依次複製,當物件的屬性值是引用型別,實質複製的是其引用,指向的值改也會跟著變化,淺拷貝只拷貝一層 深拷貝 深拷貝複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,在複製,深拷貝後的物件與原來的物件是完全隔離的,互不影響,深拷貝是層層拷貝 淺拷貝 操作 簡單...
理解「淺拷貝」和「深拷貝」
淺拷貝 將原物件 原陣列 的 引用 直接賦給新物件 新陣列 新物件 新陣列 是原物件 原陣列 的乙個引用。如果改變這個新物件 新陣列 原物件 原陣列 就會改變。深拷貝 將原物件的各項屬性的 值 陣列的所有元素 都拷貝給新物件 新陣列 是拷貝的 值 而不是 引用 為什麼要使用深拷貝?希望改變新物件 新...