堆、棧
阿新 • • 發佈:2021-08-16
var a = 20;
var b = a;
b = 30;
// 這時a的值是多少?
問題2:
var a = { name: '前端開發' }
var b = a;
b.name = '進階';
// 這時a.name的值是多少
問題3:
var a = { name: '前端開發' }
var b = a;
a = null;
// 這時b的值是多少
現在來解答一下,三個問題的答案分別是20
、‘進階’
、{ name: '前端開發' }
- 對於問題1,a、b都是基本型別,它們的值是儲存在棧中的,a、b分別有各自獨立的棧空間,所以修改了b的值以後,a的值並不會發生變化。
- 對於問題2,a、b都是引用型別,棧記憶體中存放地址指向堆記憶體中的物件,引用型別的複製會為新的變數自動分配一個新的值儲存在變數物件中,但只是引用型別的一個地址指標而已,實際指向的是同一個物件,所以修改
b.name
a.name
也就發生了改變。 - 對於問題3,首先要說明的是
null
是基本型別,a = null
之後只是把a儲存在棧記憶體中地址改變成了基本型別null,並不會影響堆記憶體中的物件,所以b的值不受影響