日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

搞懂深浅拷贝JavaScript内存之栈和堆

發(fā)布時間:2025/3/20 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 搞懂深浅拷贝JavaScript内存之栈和堆 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

對于前端來說,平時開發(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。