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