內存的概念
- 棧內存 Stack(可以理解為運行內存,如內存條):
所謂棧內存,其實就是在計算機內存中分配出來的一塊空間。
用於提供瀏覽器執行代碼的執行環境,以及存儲基本類型值。 - 堆內存 Heap (可以理解為存儲空間,如硬盤):
用於存儲引用類型值。
基本數據類型
基本數據類型有哪些?
JS 的基本數據類型有:數字、字符串、布爾值、null、undefined、symbol(ES6新增)。也就是除了對象(引用數據類型)外都是基本數據類型。
基本數據類型執行過程:
- 創建一個值(基本類型值直接存在棧內存中);
- 創建一個變量,將其存儲到VO(全局執行上下文中的全局變量對象)中;
- 讓2中創建的變量和1中創建的值關聯在一起(賦值操作)。
明確這三個步驟的順序,不可顛倒。
示例:
let a = 12;
let b = a;
b = 123;
console.log(a); // => 12
分析:
引用數據類型
引用數據類型有哪些?
所有對象都是引用數據類型,包括函數、數組這些特殊的對象。
引用數據類型值存在哪裏?
引用數據類型值都存在堆內存中。
由於引用數據類型的結構相對複雜,所以不能直接存儲在棧內存中,需要單獨開闢空間來存儲,這個空間就是“堆內存“。
引用數據類型中對象的執行過程:
-
創建值
- 開闢一個堆內存,每個堆內存都有一個16進制地址
- 把對象中的鍵值對分別存儲到對內存中
- 把對內存的地址放在棧內存中,用來供變量的引用
- 創建一個變量(棧內存中)
- 讓變量和之前創建堆內存的地址進行關聯。
示例:
let a = {
name: 'Mirror'
};
let b = a;
b.name = '顏同學';
console.log(a); //=> { name: '顏瑟' }
分析:
總結
由於瀏覽器對基本數據類型和引用數據類型的存儲方式不同,因此出現了深淺拷貝的問題。
對於引用數據類型,默認的賦值操作是淺拷貝。
- 基本數據類型是按值操作,值存儲在棧內存中。
引用數據類型是按堆內存地址操作,值存儲在堆內存中。 - 棧內存的作用是:提供瀏覽器執行代碼的執行環境,以及存儲基本類型值。
堆內存的作用是:存儲引用類型值。