每日前端基礎——JS的變量在內存中的哪里?

之前我們在學習JS的數據類型的時候就已經知道了JavaScript中的變量是分成兩種的,一種是基本數據類型,一種是引用數據類型;而在內存空間中,有兩塊地方用來存儲這些變量,棧內存和堆內存。

基本數據類型

像數字,布爾,字符串等都是存放在棧內存中的,它們的值是固定大小的,通過按值訪問,來看一下基本數據類型在內存中的表示:

基本數據類型

說到數據,還有一個就是復制值,當我們用另一個變量去復制當前聲明的變量時,會發生什么情況呢?

3.png

看到了吧,基本數據類型復制之后做修改是不會影響到原數據的,這是因為在棧中的數據發生復制行為時,系統會給新的變量分配一個新的值,棧中的數據都是相互獨立的,互相不影響。

引用數據類型

引用數據類型通常是保存在堆內存中,它們的值大小不是固定的,引用類型有一個指向堆內存中對象的指針(訪問地址,也稱引用),這個指針是存在棧里面的,在JavaScript中是不允許直接訪問堆中存儲的對象的,所以當你在操作對象的時候,實際是操作對象的指針,來看看引用類型在內存中的表示:

引用數據類型

當我們使用引用數據進行復制的時候,再改變引用數據的值,我們看看會發生什么呢?

4.png

我們可以看到,新復制的變量的修改會導致原數據的值也發生改變,這是因為我即使是在棧中為新變量分配了一個值,但是這個值在堆內存中的指向還是和原數據的指向是同一個,所以當你操作數據改變堆中變量的時候,原數據指向的值也就改變了。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容