JS中分爲兩個數據類型,分別爲基本數據類型和引用數據類型,那麼他們之間有什麼區別
1.什麼是堆棧內存
堆棧內存就是在計算機內存中分配出來的一塊空間,用於執行和存儲代碼
2.代碼在瀏覽器中的運行機制
- 在瀏覽器中打開頁面的時候,瀏覽器引擎會渲染相關的代碼,換句話說,就是把代碼從上而下的執行
- 瀏覽器執行代碼時,會提供一個供代碼執行的環境,就是棧內存
- 最開始執行的是全局下的代碼,這時會形成一個全局執行上下文,在棧內存中執行全局的代碼
- 在全局的執行上下文中有一個全局變量對象,可以把代碼中定義的變量和對應的值存儲進來
如下圖就是這樣的結構
3.定義基本數據類型步驟
以let a = 12
爲例 (注意下面的步驟是let一個變量的步驟,var會和let有些區別,這就涉及到後面的變量提升等問題,後期會有專門的的博文來講述,現在是重點理解基本數據類型與引用數據類型的區別)
- 先創建一個值12 ,因爲他是基本數據類型,結構比較簡單,因此直接把它存儲在棧內存中
- 創建一個變量a,
- 讓創建的變量a和值12,進行關聯,即賦值操作(‘=’ 賦值操作,將等號右邊的 結果 賦值給左邊)
4.定義引用數據類型步驟
以 let obj = {}
爲例
- 創建值
- 因爲是引用數據類型,會開闢一個堆內存,每一個堆內存都有一個16進制的地址
- 把對象中的鍵值對分別存儲到堆內存中
- 把堆內存的地址返回給棧內存,用來後期供變量的引用
- 創建變量obj
- 讓變量和之前創建的堆內存的地址進行關聯
5.基本數據類型與引用數據類型的區別
通過上方定義變量的步驟,可以感受出來,這兩者之間還是有很大的區別
- 基本數據類型:操作的是值,並且值存儲在棧內存中
- 引用數據類型:操作的是堆內存的引用地址,並且會把對象中的鍵值對放在堆內存中
6.棧內存與堆內存的作用
- 棧內存:
- 供代碼自上而下的執行
- 存儲基本數據類型值
- 堆內存:
- 存儲引用數據類型的值
7.代碼中找到這兩者數據類型之間的不同
基本數據類型題目:
let a = 12;
let b = a;
b = 13;
console.log(a);
講解:
基本數據類型按值操作,因此當另一個值發生改變時,並不會影響另一個值;
引用數據類型題目:
let n = {
name:'li'
};
let m = n;
m.name = 'ming';
console.log(n.name);
講解:
操作的是地址,因此指向這個地址的一個變量發生改變,都會改變