
- 對于JS的變數這個環節,其實主要要了解一下JS資料型別的存盤方法
- JS有兩種不同的資料型別:基本型別(原始型別),參考型別(物件型別),
1.堆疊 (stack) 和 堆 (heap)
堆疊 (stack):堆疊會自動分配記憶體空間,由系統進行釋放,用來存放基本資料型別 [ 數字(Number)、字串(String)、布爾(Boolean)、空(Null)、未定義(Undefined)] ,占據固定的大小的空間,是一種先進后出的資料結構,

堆 (heap):堆是基于散列演算法的資料結構,每創建一個新的物件,在堆記憶體中開辟一片新的空間;動態分配的記憶體,大小不確定,也不會自動進行釋放; 生命周期由虛擬機的垃圾回收演算法來決定;
2.JavaScript 資料型別 (基本資料型別,參考資料型別)
基本資料型別(5種): 數字(Number)、字串(String)、布爾(Boolean)、空(Null)、未定義(Undefined);直接按值
【存放在堆疊記憶體中的簡單資料段,資料大小確定,記憶體空間大小也確定】
參考資料型別:Array,Object;【存放在堆記憶體的物件,變數保存的是一個指標,空間大小不一樣】
3.圖解 資料型別的存盤方式
基本資料型別的值是直接存在堆疊記憶體中,值與值直接是相互獨立的,修改其中的一個變數不會對其他變數進行影響;
參考資料型別的值是保存在堆記憶體中,每創建一個新的物件,就在堆記憶體中開辟一個新的空間,變數保存的事物件的記憶體地址(物件的參考),相同變數保存相同的物件的時候會影響值的改變;
參考型別的存盤需要記憶體的堆疊區和堆區(堆區是指記憶體里的堆記憶體)共同完成,堆疊區記憶體保存變數識別符號和指向堆記憶體中該物件的指標,也可以說是該物件在堆記憶體的地址,
簡言之: 基本資料型別的值直接保存在堆疊記憶體;參考型別的變數標識和指標保存在堆疊記憶體,參考型別的物件保存在堆記憶體的地址;
var name = '小花'; var age = 10; var test; var arr = [1,2,3]; var obj = {age:10};
通過圖形表示基本資料型別和參考資料型別在記憶體中的存盤情況:

name,age,test三種基本資料型別是直接存盤在堆疊記憶體中;
arr,obj在堆疊記憶體中只是存盤了一個地址來表示在堆記憶體中的參考;
var a=[1,2,3]; var b=a; //傳地址,物件中傳給變數的資料是參考型別,存盤在堆記憶體中 b[0]=20; //b改變 會影響a的值的改變,因為他們指向的是同一個物件; console.log(a[0]);//20;
注意:b只是擁有了一個不同名的‘指標’,去指向在堆記憶體中的物件;并不是直接賦堆記憶體的物件,所以b改變也會改變的a的數值;所以b修改的時候,會根據地址回到a堆中修改,c則直接在堆疊中修改,并且不能指向a堆記憶體中,
當b清空的值時,只是斷開該變數與物件的聯系,另一個物件并不受影響
4.資料型別的比較
- 比較兩個基本資料型別的時候是對值之間的比較;
- 比較兩個參考資料型別的時候,是物件的記憶體地址比較;
注意: 參考資料型別的復制,就牽扯到 ‘淺拷貝’ 和 ‘深拷貝’ 的學習
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/178597.html
標籤:JavaScript
