JavaScript 之 數據在內存中的存儲和引用


棧和堆

大家都知道,JS中的數據類型包括兩種:簡單數據類型(String、Number、Boolean、undefined、null)和復雜數據類型(object)。

在內存中分為棧區(stack)和堆區(heap),簡單數據類型存放在棧區,復雜數據類型存放在堆區。在開發時,我們能直接操作棧區的變量,不能直接操作堆區,堆區數據由JS引擎操作完成。那么是怎么完成堆區變量的操作的呢,我從頭開始說起。

先畫一張圖:

簡單數據類型

  1. 聲明一個變量 a 的時候, 會在棧里面開辟出一塊新的內存空間, 用來存放這個變量a的數值
  2. 當變量 a 儲存的數值發生改變時,棧區里對應的那塊內存里存的數據也會發生改變
  3. 這是又聲明一個變量 b,並把變量a賦值給變量 b,這是在棧區里面會開辟出一塊新的空間,用來存放變量 b,變量 b 的值是變量 a 傳遞給他的。
  4. 此時這兩個變量分別對應兩塊內存,儲存的值是相同的,當變量 a 的值發生改變時,並不會影響到變量 b 的內存空間,變量 b 不會發生改變。
var a = 10;
a = 100;
var b = a;
a = 1000;
console.log(a); // 1000
console.log(b); // 100

復雜數據類型

  1. 在聲明一個對象obj1時,會在堆區中開辟一塊空間,用來存放obj1的數據 => obj1 = { name: 'zs'}
  2. 但是 obj1 這個變量卻是存儲在棧區的,obj1 指向內存中的某一個地址,通過這個地址拿到堆區對應的數據。
  3. 如果將 obj1 這個對象賦值給 obj2 時,就是把 obj1 在棧區的地址傳遞給 obj2
  4. 此時,他們共享了堆區的同一塊內存空間,如果 obj1 把對象中的一個屬性修改了,obj2 的屬性也會發生變化
  5. 如果對 obj1 重新賦值的話,那么這個對象就會指向另一塊內訓空間。就不再和 obj2 共享同一塊內存區域了
var obj1 = { name: 'zs'}
var obj2 = obj1
obj1 = {age: 23}
console.log(obj1) // {age: 23}
console.log(obj2) // {name: "zs"}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM