精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JS 中變量存儲在堆中還是棧中?(深入內存原理)

開發 前端
看到這個問題,相信大家都覺得這個題目實在基礎的不能再基礎了。隨手百度一下,就能看到很多人說:基本類型存在棧中,引用類型存在堆中。

 JavaScript中基本類型存儲在堆中還是棧中?

---- 不基本類型的基本類型

看到這個問題,相信大家都覺得這個題目實在基礎的不能再基礎了。隨手百度一下,就能看到很多人說:基本類型存在棧中,引用類型存在堆中。

真的這么簡單么?

一、裝不進冰箱的大象

讓我們看一下這段代碼:

在這里,我們聲明了一個67MiB大小的字符串,如果字符串真的存在棧中,這就不好解釋了。畢竟,v8默認的棧區大小為984KiB。肯定是存不下的。

 注:在不同時期,不同操作系統中V8對于字符串大小的限制并不相同。大概有個范圍是256MiB ~ 1GiB 

 

  1. node --v8-options | grep -B0 -A1 stack-size 

說到這里,各位是不是心里已經開始疑惑了呢。難道百度的答案不對,得用谷歌搜?

讓我們看看這到底是怎么回事。

二、影分身的字符串 

  1. const BasicVarGen = function () {  
  2.     this.s1 = 'IAmString'  
  3.     this.s2 = 'IAmString'  
  4.  
  5. let a = new BasicVarGen()  
  6. let b = new BasicVarGen() 

在這里,我們聲明了兩個一樣的對象,每個對象包括兩個相同的字符串。

通過開發者工具,我們看到雖然我們聲明了四個字符串,但是其內存指向了同一個地址。

備注:chrome無法查看實際地址,此處為抽象后的地址

這說明了啥?說明了四個字符串中存的是引用地址。

所以上文中那個無法裝進冰箱的大象,也就好解釋了。字符串并沒有存到棧中,而是存到了一個別的地方,再把這個地方的地址存到了棧中。

那,讓我們修改一下其中一個字符串的內容 

  1. const BasicVarGen = function () {  
  2.     this.s0 = 'IAmString'  
  3.     this.s1 = 'IAmString'  
  4.  
  5. let a = new BasicVarGen()  
  6. let b = new BasicVarGen()  
  7. debugger  
  8. a.s0 = 'different string'  
  9. a.s2 = 'IAmString' 

debugger之前的內存快照

debugger之后的內存快照

我們可以看到,a.s0 一開始內容為 ‘IAmString’ ,在我們修改其內容后,地址發生了變化。

而我們新增的a.s2 其內容為 ‘IAmString’ ,其地址與其他值為 ‘IAmString’  的變量保持一致。

當我們聲明一個字符串時:

    1.  v8內部有一個名為stringTable的hashmap緩存了所有字符串,在V8閱讀我們的代碼,轉換抽象語法樹時,每遇到一個字符串,會根據其特征換算為一個hash值,插入到hashmap中。

         在之后如果遇到了hash值一致的字符串,會優先從里面取出來進行比對,一致的話就不會生成新字符串類。

    2.  緩存字符串時,根據字符串不同采取不同hash方式。

所以讓我們梳理一下,在我們創建字符串的時候,V8會先從內存中(哈希表)查找是否有已經創建的完全一致的字符串,如果存在,直接復用。如果不存在,則開辟一塊新的內存空間存進這個字符串,然后把地址賦到變量中。這也是為什么我們不能直接用下標的方式修改字符串: V8中的字符串都是不可變的。

拿出一個js的基本類型拷貝舉例講一下v8的實現邏輯和常規的大家理解的邏輯(雅文) 

  1. // 例:   
  2. var a = "劉瀟灑";   // V8讀取字符串后,去stringTable查找是否存在 不存在 hashTable 插入 '劉瀟灑' 并把'劉瀟灑'的引用存入 a  
  3. var b = a; // 直接拷貝 '劉瀟灑' 的引用   
  4. b = "譚雅文"; // 查找 無 存入stringTable 

疑問點: 

  1. const BasicVarGen = function () {  
  2.     this.s0 = 'IAmString'  
  3.     this.s1 = 'IAmString'  
  4.  
  5. let a = new BasicVarGen()  
  6. let b = new BasicVarGen()  
  7. debugger  
  8. a.s0 = 'different string'  
  9. a.s2 = 'IAmString'  
  10. aa.s3 = a.s2+a.s0;   // 疑問點: 字符串拼接做了哪些操作?  
  11. aa.s4 = a.s2+a.s 

同時申請兩個拼接的字符串,內容相同。

可以看到,雖然其內容相同。但是地址并不相同。而且,地址前方的Map描述也發生了變化。

字符串拼接時如果以傳統方式(如 SeqString)存儲,拼接操作的時間復雜度為 O(n) ,采用 繩索結構[Rope Structure] (也就是 ConsString 所采用的數據結構)可以減少拼接所花費的時間。

如果字符串是這樣,那別的基本類型也是如此么?

三、如朕親臨的 ‘奇球’

說完字符串,讓我們看看V8中另外一類典型的‘基本類型’:oddBall。

拓展自oddBall的type

讓我們再做一個小實驗:

我們可以看到 上圖中列舉的基本類型,地址也是相同的。在賦值時,也是就地復用。(而且這些拓展自oddBall的基本類型,其地址是固定的,也就是說,在V8跑起來的第一時間,不管我們有沒有聲明這些基本類型,他們都已經被創建完畢了。而我們聲明對象時,賦的是他們的引用。這也可以解釋為什么我們說基本類型是賦到棧中:在V8中,存放在 @73 的值,永遠是空字符串,那么v8就可以等效把這些地址視為值本身。)

讓我們看看源碼,驗證一下:

生成各種oddBall類型的方法,可以看出返回的是一個地址

undefined賦值給一個變量,其實賦的是地址

getRoot方法

偏移量定義的地方

四、撲朔迷離的數字

之所以叫撲朔迷離的數字,是因為還沒有搞明白其分配與改變時內存分配的機制。(其內存是動態的)

smi 直接存進內存范圍為 :-2³¹ 到 2³¹-1(2³¹≈2*10⁹)的整數

heapNumber 類似字符串 不可變范圍為 :所有非smi的數字

最低位用來表示是否為指針 最低位為1 則是一個指針 

  1. const o = {  
  2.   x: 42,  // Smi  
  3.   y: 4.2, // HeapNumber  
  4. }; 

o.x中的42會被當成Smi直接存儲在對象本身,而o.y中的4.2需要額外開辟一個內存實體存放,并將o.y的對象指針指向該內存實體。

如果是 32 位操作系統,用32位表示smi 可以理解,可是64位操作系統中,為什么 smi 范圍也是 -2³¹ 到 2³¹-1(2³¹≈2*10⁹)?

ECMAScript 標準約定number數字需要被當成 64 位雙精度浮點數處理,但事實上,一直使用 64 位去存儲任何數字實際是非常低效的(空間低效,計算時間低效 smi大量使用位運算),所以 JavaScript 引擎并不總會使用 64 位去存儲數字,引擎在內部可以采用其他內存表示方式(如 32 位),只要保證數字外部所有能被監測到的特性對齊 64 位的表現就行。 

  1. const cycleLimit = 50000  
  2. console.time('heapNumber')  
  3. const foo = { x: 1.1 };  
  4. for (let i = 0; i < cycleLimit; ++i) {  
  5. // 創建了多出來的heapNumber實例  
  6.   foo.x += 1;   
  7.  
  8. console.timeEnd('heapNumber') // slow    
  9. console.time('smi')  
  10. const bar = { x: 1.0 };  
  11. for (let i = 0; i < cycleLimit; ++i) {  
  12.   bar.x += 1;  
  13.  
  14. console.timeEnd('smi')  // fast 

疑問點: 

  1. const BasicVarGen = function () {  
  2.     this.smi1 = 1  
  3.     this.smi2 = 2  
  4.     this.heapNumber1 = 1.1  
  5.     this.heapNumber2 = 2.1  
  6.  
  7.     let foo = new BasicVarGen()  
  8.     let bar = new BasicVarGen()    
  9.      debugger      
  10.     baz.obj1.heapNumber1 ++ 

在數字中,一個數字的值都沒有修改,其他的數字地址也都變了。

五、小結:基本類型到底存在哪里?

字符串: 存在堆里,棧中為引用地址,如果存在相同字符串,則引用地址相同。

數字:     小整數存在棧中,其他類型存在堆中。

其他類型:引擎初始化時分配唯一地址,棧中的變量存的是唯一的引用。

這里只能算是大概講明白了基本類型存在哪里,

在學習探索的過程中,雖然一些疑問得到了解答,但是問題卻變得更多了。 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2009-06-03 15:52:34

堆內存棧內存Java內存分配

2009-06-08 22:01:03

Java堆Java棧區別

2010-10-14 09:34:34

JVM局部變量

2024-04-30 08:38:31

C++

2011-07-22 16:50:05

JAVA

2016-08-31 15:50:50

PythonThreadLocal變量

2018-06-20 10:34:56

堆棧iOSswift

2024-01-09 09:23:12

指針C++

2013-06-20 10:25:56

2022-03-16 08:39:19

StackHeap內存

2011-07-22 17:06:22

java

2021-03-06 22:41:06

內核源碼CAS

2012-08-15 14:44:53

GC

2020-05-22 10:40:33

ContinuatioJS前端

2017-03-20 13:43:51

Node.js內存泄漏

2017-03-19 16:40:28

漏洞Node.js內存泄漏

2010-03-29 13:19:10

OracleMulti

2018-07-09 13:40:24

前端javascript

2009-07-14 17:30:21

Jython語法學習

2016-08-31 15:41:19

PythonThreadLoca變量
點贊
收藏

51CTO技術棧公眾號

国产日产在线观看| 久久精品无码中文字幕| 伊人久久国产精品| 色呦呦在线视频| 日日噜噜夜夜狠狠视频欧美人| 亚洲欧美制服中文字幕| 亚洲 欧美 另类人妖| 免费观看久久久久| 成人av在线影院| 国产精品扒开腿做| free性中国hd国语露脸| 日本国产欧美| 亚洲国产精品自拍| 一区二区三区我不卡| 欧美一级在线免费观看 | 色综合天天综合网国产成人网 | av男人的天堂在线观看| 欧美极品xxx| 国产精品区一区二区三含羞草| 懂色av蜜臀av粉嫩av分享吧最新章节| 亚洲精品午夜av福利久久蜜桃| 日韩精品视频三区| 91欧美一区二区三区| japanese23hdxxxx日韩| 亚洲成人高清在线| 一区精品在线| 第一福利在线| 日韩高清不卡一区二区| 欧美麻豆久久久久久中文| 久久亚洲无码视频| 欧美性生活一级片| 日韩欧美一区视频| 屁屁影院ccyy国产第一页| 成人午夜电影在线观看| 99re6这里只有精品视频在线观看| 国产欧美日韩中文| 无码人妻黑人中文字幕| 99精品国产福利在线观看免费| 欧美成人性福生活免费看| 久久久久久久片| 手机在线免费观看av| 中文字幕一区二| 亚洲三区视频| 一二三四区在线| 久久国产88| 18久久久久久| 国产视频91在线| 在线精品在线| 性欧美xxxx视频在线观看| 青青草手机在线视频| 天天影视欧美综合在线观看| 日韩欧美色电影| 亚洲一区日韩精品| 成人午夜一级| 欧美在线一区二区| 91色国产在线| 日韩欧美激情| 欧美日韩和欧美的一区二区| 欧美特级aaa| 国内自拍亚洲| 夜夜爽夜夜爽精品视频| 男插女免费视频| 国产素人视频在线观看| 成人av在线资源| 国产中文一区二区| 人妻一区二区三区免费| 99久久国产综合精品麻豆| 国产一区在线免费| 瑟瑟在线观看| 国产欧美一区二区在线观看| 亚洲国产精品久久久久婷婷老年 | 国产乱人伦丫前精品视频| 精品88久久久久88久久久| 97精品人妻一区二区三区蜜桃| 99久久香蕉| 亚洲精品久久久久| 人妻视频一区二区| 91精品一区二区三区综合| 欧美黑人巨大xxx极品| 日韩av片在线播放| 久久只有精品| 91免费的视频在线播放| 黄色一级a毛片| www激情久久| 亚洲伊人久久综合| 狠狠躁夜夜躁av无码中文幕| 91美女片黄在线| 亚洲国产精品www| 色网在线观看| 一本久道久久综合中文字幕| 亚洲 激情 在线| 亚洲超碰在线观看| 亚洲欧美制服中文字幕| 破处女黄色一级片| 午夜亚洲福利在线老司机| 国产精品视频大全| 丰满岳乱妇国产精品一区| 久久精品欧美一区二区三区麻豆| 国产99视频精品免费视频36| 免费动漫网站在线观看| www.亚洲国产| 亚洲图色在线| 美女高潮视频在线看| 欧美日本在线一区| 国产乱了高清露脸对白| 国产大片一区| 青草青草久热精品视频在线网站| 国产精品-色哟哟| 91麻豆免费看| 精品久久久无码人妻字幂| 黄色片网站在线| 精品欧美aⅴ在线网站| 亚洲第一色av| 精品国产一区二区三区四区| 欧美激情欧美激情| 一区两区小视频| 成人国产亚洲欧美成人综合网| 一区二区日本| 欧美一区 二区 三区| 亚洲第五色综合网| 一区视频免费观看| 免费看欧美女人艹b| 精品在线观看一区二区| 污污网站在线观看| 欧美精品v国产精品v日韩精品| 不用播放器的免费av| 亚洲精品亚洲人成在线观看| 欧美国产日韩一区二区在线观看| 美女黄页在线观看| 久久久国产午夜精品| 欧美三级一级片| 高潮按摩久久久久久av免费| 久久精品2019中文字幕| 中文字幕+乱码+中文| 久久久一区二区| 成年人观看网站| 丝袜美腿一区二区三区动态图| 亚洲人线精品午夜| 国产一级特黄aaa大片| 国产精品一品二品| 91香蕉视频网址| 欧美天堂在线| 色一区av在线| 一级黄色大毛片| 国产精品二区一区二区aⅴ污介绍| 日韩精品一区中文字幕| 久久99国产成人小视频| 精品国产一区二区在线| 中文字幕永久免费视频| 国产欧美精品区一区二区三区| 成年人免费在线播放| 亚洲欧美成人vr| 茄子视频成人在线| 成人三级黄色免费网站| 欧美日韩中文字幕一区| 成人无码精品1区2区3区免费看| 日本欧美大码aⅴ在线播放| 色就是色欧美| 国产成+人+综合+亚洲欧美| 日韩中文字幕不卡视频| 一本一道精品欧美中文字幕| 国产精品成人免费| 久久久精品视频国产| 欧美日韩第一区| 国产精品污www一区二区三区| caoprom在线| 亚洲女同性videos| 中文天堂在线视频| 亚洲欧美日韩中文播放 | 在线日韩第一页| 在线免费av网| 一区二区不卡在线播放 | 欧美激情a在线| 色偷偷在线观看| 色嗨嗨av一区二区三区| 激情高潮到大叫狂喷水| 国产精品1区二区.| 日韩激情免费视频| 99精品在线| 国产一区二区不卡视频| 国产精品高清乱码在线观看| 欧美一级片免费看| 国产精品111| 国产亚洲欧美在线| 一级片免费在线观看视频| 悠悠资源网久久精品| 欧美精品与人动性物交免费看| av网站网址在线观看| 精品国产乱码久久久久久浪潮| 久久亚洲精品国产| 成人精品免费网站| 别急慢慢来1978如如2| 最新欧美人z0oozo0| 久久精品国产99精品国产亚洲性色| av免费在线一区| 欧美日韩国产成人| 搞黄视频在线观看| 精品日产卡一卡二卡麻豆| 精品无码一区二区三区的天堂| 亚洲视频在线观看三级| 51调教丨国产调教视频| 国产麻豆视频精品| 日韩无套无码精品| 国产精品xvideos88| 亚洲成人a**址| 久久久免费毛片| 91九色国产在线| 国产精品伦理| 国内伊人久久久久久网站视频 | 国产精品久线在线观看| 青青草av网站| 尹人成人综合网| 在线免费观看成人网| 凹凸日日摸日日碰夜夜爽1| 黄瓜视频成人app免费| 欧美精品电影免费在线观看| 三区四区在线视频| 亚洲男人的天堂在线| 午夜免费福利视频| 在线播放国产精品二区一二区四区| 中文字幕亚洲精品一区| 亚洲夂夂婷婷色拍ww47| 最新av电影网站| 中文字幕精品三区| 久久精品视频18| 91玉足脚交白嫩脚丫在线播放| 亚洲熟女乱综合一区二区| 麻豆精品一二三| 在线免费视频a| 亚洲欧美日韩专区| 91视频最新入口| 亚洲韩日在线| av网站手机在线观看| 一二三区不卡| 看一级黄色录像| 五月天久久久| 偷拍盗摄高潮叫床对白清晰| 不卡中文字幕| 五月婷婷一区| 欧美日韩中文一区二区| 日韩av一区二区三区在线| 在线成人动漫av| 日本成人三级| 精品久久久久久久久久久aⅴ| 久久久久久草| 国产调教一区二区三区| 麻豆av福利av久久av| 日本高清不卡一区二区三区视频| 97国产suv精品一区二区62| av在线不卡免费| 午夜伦理精品一区| 久久影院午夜精品| 热久久免费视频精品| www.成人影院| 国内伊人久久久久久网站视频 | 欧美精品乱码| 免费99视频| 精品国内自产拍在线观看视频 | 成人午夜黄色影院| 国产一区二区三区精品在线观看| 欧美在线免费视屏| 精品中文字幕av| 亚洲男女自偷自拍| 毛葺葺老太做受视频| 青青草原综合久久大伊人精品优势| 牛夜精品久久久久久久| 精品一区二区三区影院在线午夜 | 啦啦啦免费高清视频在线观看| 狠狠做深爱婷婷久久综合一区| 国产寡妇亲子伦一区二区三区四区 | 欧美中文字幕在线| 欧美电影免费观看高清完整| 国产精品视频一区二区高潮| 57pao成人永久免费| 国产福利久久精品| 国产成人精品免费视| 自拍偷拍一区二区三区| 韩国av一区| 999精品网站| 国产在线视频一区二区| 熟妇高潮一区二区| 26uuu色噜噜精品一区二区| 毛片视频免费播放| 久久精品一区二区三区不卡 | 欧美中在线观看| 国产精品一区二区免费福利视频| 91在线高清免费观看| 欧美色资源站| 99精品视频网站| 亚洲色诱最新| 永久免费的av网站| 99久久精品免费精品国产| 美国美女黄色片| 亚洲电影激情视频网站| 中文字幕欧美色图| 亚洲国产成人精品久久| √天堂资源地址在线官网| 久久久久久久国产| 日韩毛片免费看| 久久亚洲免费| 午夜精品久久久久99热蜜桃导演| 国产美女三级视频| 国产精品456露脸| 快灬快灬一下爽蜜桃在线观看| 亚洲高清免费视频| 一级特黄录像免费看| 国产丝袜一区二区| 欧美xxxx黑人又粗又长| 国产欧美精品一区二区| 小嫩嫩12欧美| 亚洲 欧美 综合 另类 中字| 麻豆成人久久精品二区三区小说| 国产精品无码专区| 一区二区三区在线观看视频| 亚洲怡红院av| 亚洲欧美日韩高清| 国产美女高潮在线| 成人看片视频| 亚洲伊人影院| 亚洲午夜激情| 视频一区二区三区在线| 久久久久亚洲av成人网人人软件| 久久精品水蜜桃av综合天堂| 国产精品18p| 日韩欧美区一区二| 精品孕妇一区二区三区| 国产精品久久一区| 九九综合在线| 国产最新免费视频| 不卡视频一二三| 不卡的免费av| 欧美变态tickle挠乳网站| www视频在线免费观看 | 丁香五月缴情综合网| 青青草原国产免费| 精品一区二区在线播放| 波多野结衣欲乱| 精品污污网站免费看| 成年网站在线| 国产精品日日做人人爱| 国产一区二区精品福利地址| 精品久久久久久久免费人妻| 久久一区二区视频| 欧美啪啪小视频| 亚洲精选中文字幕| 国产精品伦理| 水蜜桃一区二区三区| 蜜桃精品视频在线| 18精品爽国产三级网站| 欧美午夜不卡视频| 日本高清视频在线观看| 成人免费看片视频| 欧美黄色免费| 国产精品手机在线观看| 欧美日韩国产综合新一区| 三级理论午夜在线观看| 国产精品69久久久久| av伊人久久| 91av视频免费观看| 亚洲精品国产视频| 色综合免费视频| 欧美一二三视频| 国产精品一在线观看| 九九热精品在线播放| 亚洲色图.com| 人人妻人人澡人人爽精品日本| 午夜精品免费视频| 国产欧美日韩影院| 亚洲va在线va天堂va偷拍| 亚洲三级在线看| 神马一区二区三区| 国产精品高清在线| 久久久久国产精品| 成人午夜精品无码区| 色婷婷综合久久久中文一区二区| 成人免费视频| 9a蜜桃久久久久久免费| 99热在线精品观看| www..com.cn蕾丝视频在线观看免费版| 欧美日韩日日夜夜| 黄页网站在线| 亚洲精品免费av| 亚洲国产电影| 亚洲色图欧美色| 精品久久99ma| 欧美色网在线| 女人色极品影院| 欧美国产国产综合| 精品人妻一区二区三区四区不卡| 欧美亚洲第一页| 一区二区三区在线电影| 国产一级二级在线观看| 欧美人妖巨大在线| 美女高潮视频在线看| 午夜啪啪免费视频| 久久免费视频一区| 亚洲成人久久精品| 国产精品久久久久久久久久新婚| 欧美精品1区| 毛片久久久久久|