棧和堆
大家都知道,JS中的數據類型包括兩種:簡單數據類型(String、Number、Boolean、undefined、null)和復雜數據類型(object)。
在內存中分為棧區(stack)和堆區(heap),簡單數據類型存放在棧區,復雜數據類型存放在堆區。在開發時,我們能直接操作棧區的變量,不能直接操作堆區,堆區數據由JS引擎操作完成。那么是怎么完成堆區變量的操作的呢,我從頭開始說起。

簡單數據類型
- 聲明一個變量 a 的時候, 會在棧里面開辟出一塊新的內存空間, 用來存放這個變量a的數值
- 當變量 a 儲存的數值發生改變時,棧區里對應的那塊內存里存的數據也會發生改變
- 這是又聲明一個變量 b,並把變量a賦值給變量 b,這是在棧區里面會開辟出一塊新的空間,用來存放變量 b,變量 b 的值是變量 a 傳遞給他的。
- 此時這兩個變量分別對應兩塊內存,儲存的值是相同的,當變量 a 的值發生改變時,並不會影響到變量 b 的內存空間,變量 b 不會發生改變。
var a = 10; a = 100; var b = a; a = 1000; console.log(a); // 1000 console.log(b); // 100
復雜數據類型
- 在聲明一個對象obj1時,會在堆區中開辟一塊空間,用來存放obj1的數據 => obj1 = { name: 'zs'}
- 但是 obj1 這個變量卻是存儲在棧區的,obj1 指向內存中的某一個地址,通過這個地址拿到堆區對應的數據。
- 如果將 obj1 這個對象賦值給 obj2 時,就是把 obj1 在棧區的地址傳遞給 obj2
- 此時,他們共享了堆區的同一塊內存空間,如果 obj1 把對象中的一個屬性修改了,obj2 的屬性也會發生變化
- 如果對 obj1 重新賦值的話,那么這個對象就會指向另一塊內訓空間。就不再和 obj2 共享同一塊內存區域了
var obj1 = { name: 'zs'} var obj2 = obj1 obj1 = {age: 23} console.log(obj1) // {age: 23} console.log(obj2) // {name: "zs"}
