let a = 20;
let b = a;
b = 10;
console.log(a,b) //a = 20, b = 10
在上面的**片段中,a=20,b=10是毋庸置疑,因為number是基礎資料型別,值存在於棧中,對於b的重新賦值並不會影響到a,再來看另乙個例子。
let obj =
let a = obj;
a.a = 20;
console.log(a.a, obj.a)// 20, 20
在上面的**中我們可以看到,我們先定義了乙個obj=,obj是乙個物件,既我們說的引用型別,那麼存放obj的值的時候js會給obj開闢乙個記憶體空間,記憶體空間存放的是obj的字串**片段,既「a:10」,而obj跟這個堆記憶體空間是怎麼關聯起來的呢,其實二者之間有個聯絡,就是obj指向的是堆記憶體空間的位址,這裡我們假設位址為「fffaaa000」,那麼這個obj存的就是這個位址,當呼叫obj的時候,obj通過這個記憶體位址去訪問內部的**片段。如下圖
因此,當執行到let a = obj;時,這裡其實是把obj的記憶體位址賦值給了a物件,因此a的堆記憶體位址適合obj是一樣的,他們指向的是同一片記憶體空間,那麼在我們執行a.a=20;的時候,a通過堆記憶體位址訪問到**片段並把原來的「a:10」改為了「a:20」,因此在我們最好列印的時候兩個輸出都是20。
在這裡我就先舉兩個簡單的例子給大家大致講解一下堆記憶體和棧記憶體的儲存方式,希望大家理解
js堆記憶體和棧記憶體
var a 12 1.先宣告乙個變數a 沒有賦值 預設是undefined 2.在當前作用域中開闢乙個位置儲存12 這個值 3.讓變數a和12關聯在一起 定義 賦值 任意數求和 function sum var total null for var i 0 i當棧記憶體被銷毀,儲存的那些基本值也就跟...
堆記憶體和棧記憶體
堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不...
堆記憶體和棧記憶體
一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式 類似於資料結構中的棧 2 堆區 heap 一般由程式設計師分配釋放 若程式設計師不釋放,程式結束時可能由 os 注意它與資...