對於JS的變數這個環節,其實主要要瞭解一下JS數據類型的存儲方法 JS有兩種不同的數據類型:基本類型(原始類型),引用類型(對象類型)。 1.棧 (stack) 和 堆 (heap) 棧 (stack):棧會自動分配記憶體空間,由系統進行釋放,用來存放基本數據類型 [ 數字(Number)、字元串(S ...
- 對於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.數據類型的比較
- 比較兩個基本數據類型的時候是對值之間的比較;
- 比較兩個引用數據類型的時候,是對象的記憶體地址比較;
註意: 引用數據類型的複製,就牽扯到 ‘淺拷貝’ 和 ‘深拷貝’ 的學習