搞懂深浅拷贝JavaScript内存之栈和堆
對于前端來說,平時開發(fā)業(yè)務(wù)代碼的時候根本不會關(guān)心JavaScript的內(nèi)存問題,因為根本用不到,也因此對于內(nèi)存分配沒有一點概念。只有理解了內(nèi)存分配,對于深拷貝和淺拷貝才能真正理解。當然,理解內(nèi)存分配對JavaScript才會有更深層次的理解。
基本所有程序都有內(nèi)存的概念,我們只要簡單理解JavaScript是怎么分配內(nèi)存的就夠了。JavaScript內(nèi)存可以理解就分為兩塊,一個是棧,一個是堆。棧是有序的,拿兵乓球盒子來記憶確實很生動,先進后出。但是我不清楚真正取數(shù)據(jù)的時候程序是怎么執(zhí)行的。堆是無序的,里面存放的數(shù)據(jù)通過指針獲取。棧的存取速度大于堆。
我們都知道JavaScript有五個基礎(chǔ)數(shù)據(jù)類型,Undefined、Null、Boolean、Number、String,在JavaScript內(nèi)存分配中,基礎(chǔ)數(shù)據(jù)類型存放在棧中,引用數(shù)據(jù)類型Object,也就是Array、Data等存放在堆中,但是棧存儲著指向堆的指針地址。
比如:
var a = 1; var b = 2; var c = 3; var d = [1]; var e = {e: 1};
在內(nèi)存中大概是這樣的:
d和c都只是存儲一個地址,數(shù)據(jù)存儲在堆中,這個地址指向堆,至于這個地址是什么,我就不知道了,這邊我只是參考網(wǎng)上的格式。a、b、c基礎(chǔ)數(shù)據(jù)類型則是直接存儲在棧中。
知道了這個,我們就很容易理解
var a = {a: 15, b: 20}; var b = a; b.a = 30; alert(a.a);
為什么彈出來的是30了。如下圖:
因為a和b都是對象,把a賦值給b的時候,只是把地址賦值給了b,指向的是堆內(nèi)相同的數(shù)據(jù),所以在改變b的數(shù)據(jù)的時候,堆內(nèi)數(shù)據(jù)改變了,但是a和b地址指針相同,所以彈出來的也是30。
知道了基礎(chǔ)數(shù)據(jù)類型和引用數(shù)據(jù)類型在棧和堆內(nèi)的存儲,深拷貝和淺拷貝是不是就變的很簡單,跟知道了GC機制之后理解閉包就容易很多一樣。想要真的學習JavaScript這門語言,很多基礎(chǔ)知識真的很重要。
歡迎關(guān)注Coding個人筆記公眾號
轉(zhuǎn)載于:https://juejin.im/post/5c4ed2246fb9a04a04416a03
總結(jié)
以上是生活随笔為你收集整理的搞懂深浅拷贝JavaScript内存之栈和堆的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将Hexo同时部署在github和腾讯云
- 下一篇: Spring Cloud Gateway