1、堆疊
棧(stack):系統自動分配的記憶體空間,記憶體會由系統自動釋放,用來存放函式的引數值,區域性變數的值等,特點是先進後出。
堆(heap):系統動態分配的記憶體,記憶體大小不一,記憶體不會自動釋放。一般由程式設計師分配釋放,主要負責像obejct這種變數型別的儲存。
2、基本資料型別
概念:存放在棧記憶體中的簡單資料段,資料大小確定,記憶體空間大小確定。
6種基本資料型別:undefined、null、boolean、number、string、symbol
3、引用資料型別1、淺拷貝
概念:子物件複製父物件,父子物件發生關聯,兩者屬性值指向同一記憶體空間。簡單來講,就是改變其中乙個物件,另乙個物件也會跟著改變。
舉例:
let a = [0,1,2],b =a;
a[0] = 3;
console.log(a,b)
//[3,1,2] [3,1,2]
2、深拷貝
概念:拷貝物件各個層級的屬性。簡單的講,就是複製出來的每個物件都有屬於自己的記憶體空間,不會互相干擾。
1、封裝深拷貝函式
functiondeepclone(obj) ;
if(obj && typeof obj === "object")
else}}
}
return
objclone
}
let a = [1,2,3,4],
b =deepclone(a);
a[0] = 5;
console.log(a,b)
2、借用json物件的 parse 和 stringify
functiondeepclone(obj)
let a=[0,1,[2,3],4],
b=deepclone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
原理:基本型別拷貝是直接在棧記憶體新開空間,直接複製乙份名-值,兩者互不影響。
而引用資料型別,比如物件,變數名在棧記憶體,值在堆記憶體,拷貝只是拷貝了堆記憶體提供的指向值的位址,而json.stringify()巧就巧在能將乙個物件轉換成字串,也就是基本型別,那這裡的原理就是先利用json.stringify()將物件轉變成基本資料型別,然後使用了基本型別的拷貝方式,再利用json.parse()將這個字串還原成乙個物件,達到了深拷貝的目的。
3、借用 jq 的 extend 方法實現深拷貝。
$.extend([deep], target, ...object);
deep表示深拷貝,boolean
target目標物件
...object需要進行合併的物件
本文是對於深淺拷貝的學習筆記整理記錄。感謝 聽風是風 博主的分享!
js實現深拷貝和淺拷貝
let obj let newobj obj.age.age 25 修改第二層的obj.age.age,newobj.age.age也會跟著變化 console.log newobj 複製 注意 資料的slice和concat方法也是淺拷貝,只能拷貝一層 原理 把乙個物件轉化成乙個字串,再把這個字串...
js實現深拷貝和淺拷貝
淺拷貝 思路 把父物件的屬性,全部拷貝給子物件,實現繼承。問題 如果父物件的屬性等於陣列或另乙個物件,那麼實際上,子物件獲得的只是乙個記憶體位址,不會開闢新棧,不是真正拷貝,因此存在父物件被篡改的可能。function deepcopy o for i in o return f 深拷貝 思路 遞迴...
js 深拷貝和淺拷貝區別,以及實現深拷貝的方法
定義 1.深拷貝 function deepcopy obj var obj say console.log deepcopy obj 注意 這種拷貝方法不可以拷貝一些特殊的屬性 例如正規表示式,undefine,function function deepcopytwo obj if obj ty...