大家好,我是林三心,用最通俗易懂的話講最難的知識點(diǎn)是我的座右銘,基礎(chǔ)是進(jìn)階的前提是我的初心。
在我們的認(rèn)知里:基礎(chǔ)類型存棧內(nèi)存,引用數(shù)據(jù)類型存堆內(nèi)存。
const a = '林三心'const b = { age: 18, height: 180}
圖片
大家都知道,字符串屬于基礎(chǔ)類型,所以大家會覺得字符串是存在棧內(nèi)存中的,但是大家要知道,V8默認(rèn)棧內(nèi)存是984Kib,那如果一個(gè)超長字符串 > 984Kib能裝的進(jìn)棧內(nèi)存嗎?這也就是一個(gè)比較經(jīng)典的問題——大象裝箱問題,試問:一頭大象能裝進(jìn)一個(gè)小箱子里嗎?
圖片
先來看一段代碼
const func = function() { this.str1 = '林三心' this.str2 = 'Sunshine_Lin'}const a = new func()const b = new func()
然后咱們來看看堆快照的詳情
圖片
上面的結(jié)果可以看出:
那我們可不可以猜測出一個(gè)結(jié)論:字符串的內(nèi)容存于堆內(nèi)存中,指針存于棧內(nèi)存中,且相同的字符串指向同一個(gè)堆內(nèi)存地址
我們稍微修改下代碼
const func = function() { this.str1 = '林三心' this.str2 = 'Sunshine_Lin'}const a = new func()const b = new func()// 修改str1a.str1 = '哈哈哈哈哈哈哈哈哈哈'// 新增str3,跟str2一樣a.str3 = 'Sunshine_Lin'
再來看看現(xiàn)階段的堆快照的詳情
圖片
上面的結(jié)果可以看出:
那我們可不可以猜測出一個(gè)結(jié)論:新增或者修改字符串后,如果是一個(gè)之前不存在的字符串,則新開辟內(nèi)存空間,如果是已有的,則直接使用已有的內(nèi)存空間
當(dāng)我們聲明一個(gè)字符串時(shí):
圖片
圖片
圖片
字符串的數(shù)據(jù)存于 堆內(nèi)存 中,棧內(nèi)存 中只是存其 地址指針
當(dāng)我們新建一個(gè)字符串時(shí),V8會從內(nèi)存中查找一下是否已經(jīng)有存在的一樣的字符串,找到的話直接復(fù)用。如果找不到的話,則開辟一塊新的內(nèi)存空間來存這個(gè)字符串,并把地址賦給變量。
大家有沒有想過,為什么字符串不能通過下標(biāo)索引來進(jìn)行修改呢?因?yàn)樽址男薷谋举|(zhì)上只能是通過整個(gè)的修改,而不能局部修改。
本文鏈接:http://www.www897cc.com/showinfo-26-79841-0.html「字符串」存在「棧內(nèi)存」?那我可要杠你了哦!
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: ZGC可伸縮低延遲垃圾收集器深度解析