JavaScript中的變量在內存中的具體存儲形式


棧內存和堆內存

JavaScript中的變量分為基本類型和引用類型 基本類型是保存在棧內存中的簡單數據段,它們的值都有固定的大小,保存在棧空間,通過按值訪問

引用類型是保存在堆內存中的對象,值大小不固定,棧內存中存放的該對象的訪問地址指向堆內存中的對象,JavaScript不允許直接訪問堆內存中的位置,因此操作對象時,實際操作對象的引用

結合代碼與圖來理解

let a1 = 0; // 棧內存
let a2 = "this is string" // 棧內存
let a3 = null; // 棧內存
let b = { x: 10 }; // 變量b存在於棧中,{ x: 10 }作為對象存在於堆中
let c = [1, 2, 3]; // 變量c存在於棧中,[1, 2, 3]作為對象存在於堆中

 

 

當我們要訪問堆內存中的引用數據類型時

  1. 從棧中獲取該對象的地址引用

  2. 再從堆內存中取得我們需要的數據

基本類型發生復制行為

let a = 20;
let b = a;
b = 30;
console.log(a); // 20

結合下面圖進行理解:

 

 

在棧內存中的數據發生復制行為時,系統會自動為新的變量分配一個新值,最后這些變量都是相互獨立互不影響的

 

引用類型發生復制行為

let a = { x: 10, y: 20 }
let b = a;
b.x = 5;
console.log(a.x); // 5
  1. 引用類型的復制,同樣為新的變量b分配一個新的值,保存在棧內存中,不同的是,這個值僅僅是引用類型的一個地址指針

  2. 他們兩個指向同一個值,也就是地址指針相同,在堆內存中訪問到的具體對象實際上是同一個

  3. 因此改變b.x時,a.x也發生了變化,這就是引用類型的特性

結合下圖理解

 

 

 

總結

 

 

原文鏈接:https://www.jianshu.com/p/80bb5a01857a


免責聲明!

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



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