之前我們在學習JS的數據類型的時候就已經知道了JavaScript中的變量是分成兩種的,一種是基本數據類型,一種是引用數據類型;而在內存空間中,有兩塊地方用來存儲這些變量,棧內存和堆內存。
基本數據類型
像數字,布爾,字符串等都是存放在棧內存中的,它們的值是固定大小的,通過按值訪問,來看一下基本數據類型在內存中的表示:
基本數據類型
說到數據,還有一個就是復制值,當我們用另一個變量去復制當前聲明的變量時,會發生什么情況呢?
3.png
看到了吧,基本數據類型復制之后做修改是不會影響到原數據的,這是因為在棧中的數據發生復制行為時,系統會給新的變量分配一個新的值,棧中的數據都是相互獨立的,互相不影響。
引用數據類型
引用數據類型通常是保存在堆內存中,它們的值大小不是固定的,引用類型有一個指向堆內存中對象的指針(訪問地址,也稱引用),這個指針是存在棧里面的,在JavaScript中是不允許直接訪問堆中存儲的對象的,所以當你在操作對象的時候,實際是操作對象的指針,來看看引用類型在內存中的表示:
引用數據類型
當我們使用引用數據進行復制的時候,再改變引用數據的值,我們看看會發生什么呢?
4.png
我們可以看到,新復制的變量的修改會導致原數據的值也發生改變,這是因為我即使是在棧中為新變量分配了一個值,但是這個值在堆內存中的指向還是和原數據的指向是同一個,所以當你操作數據改變堆中變量的時候,原數據指向的值也就改變了。