在學習js時最讓我頭疼的就是棧和堆以及一切概念性的問題 也是最近才把想給這個搞通提上了日程
簡單來說 深淺拷貝的區別:
a複製了b 當改變 a 中的乙個元素 b 中的這個元素也改變了 這就叫做淺拷貝
反之 改變 a 中的元素 b 中的元素並沒有一起改變 這就叫做 深拷貝 深拷貝都是針對於較為複雜的object型別
這個也就要牽扯到棧和堆 以及 資料型別的概念了
js幾大基本資料型別: null undefined number boolean string object symbol(唯一值) bigint(es10未來 任意精度整數)
引用型別:object類 --- 常規名值對的無序物件 陣列:[1, 2] 函式等
1、基本型別 --- 名值都儲存再棧記憶體中; let a = 1
當 b = a 複製時; 棧記憶體會新開闢乙個記憶體
所以當你修改 a = 2 時 b 的值並不會發生改變 但這也算不上深拷貝 因為深拷貝都是針對於較為複雜的object型別
2、引用型別 名存棧記憶體中 值存堆記憶體中 但是棧記憶體會提供乙個引用位址指向堆記憶體中的值
所以當 a = b 進行拷貝的時候 複製的是 a 的引用位址 而非堆裡面的值
當我們 a [0] = 7 時 由於 a 和 b 指向的都是同乙個堆記憶體值 所以 a 的修改 影響到了 b 這就是所謂的淺拷貝
所以要實現深拷貝 就是要在堆記憶體中新建乙個 b 的堆記憶體
實現深拷貝
function deepclone(obj)
let a = [0, 1, [3,4], 9]
b = deepclone(a)
a[2][0] = 7
console.log(a, b) //[0,1,[7,4],9] [0, 1, [3,4], 9]
json.stringify() 和 json.parse() 的區別
json.stringify() 將物件轉換為 json字串 而 json.parse() 則是將json字串轉換為 物件
但是在使用json.parse()時 所轉換的json字串必須要符合josn格式 即鍵值都需要 "" 進行包裹
let a = '["1","2"]';遞迴方式實現:let b = "['1','2']";
console.log(json.parse(a));// array [1,2]
console.log(json.parse(b));// 報錯
陣列放 splice concat slice 都不是真正的深拷貝 在一級層級是沒問題的 當有二層層級時 就會被影響
JS深淺拷貝的多種實現方式
通過for迴圈遍歷 let obj2 for let key in obj 通過 擴充套件運算子 let obj2 概念 開闢一塊新的記憶體空間,複製要拷貝的資料至新建立的記憶體空間,兩個資料結構的增刪改查互不干擾。使用json的函式 不適用於物件中含有函式 正則 日期 let obj2 json ...
js實現深淺拷貝
一 實現淺拷貝的方法 1 直接用 賦值 let a 0 1,2 3,4 b a console.log a b a 0 1 console.log a,b 兩個相同的 1,1,2,3,4 2 for in只迴圈第一層 只複製第一層的淺拷貝 function copy obj1 for let i i...
深淺拷貝以及深淺拷貝的方法
先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式 拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,name指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會造成記憶...