日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解JS內存空間

瀏覽:149日期:2024-03-23 09:13:25
目錄概述一、棧與堆二、變量對象與基礎數據類型三、引用數據類型與堆內存內存空間管理概述

變量對象與堆內存

var a = 20;var b = ’abc’;var c = true;var d = { m: 20 }

詳解JS內存空間

在很長一段時間里認為內存空間的概念在JS的學習中并不是那么重要。可是后我當我回過頭來重新整理JS基礎時,發現由于對它們的模糊認知,導致了很多東西我都理解得并不明白。比如最基本的引用數據類型和引用傳遞到底是怎么回事兒?比如淺復制與深復制有什么不同?還有閉包,原型等等。

因此后來我才漸漸明白,想要對JS的理解更加深刻,就必須對內存空間有一個清晰的認知。

一、棧與堆

注:棧,也可以叫堆棧

與C/C++不同,JavaScript中并沒有嚴格意義上區分棧內存與堆內存。因此我們可以粗淺的理解為JavaScript的所有數據都保存在堆內存中。但是在某些場景,我們仍然需要基于堆棧數據結構的思路進行處理,比如JavaScript的執行上下文(關于執行上下文我會在下一篇文章中總結)。執行上下文在邏輯上實現了堆棧。因此理解堆棧數據結構的原理與特點任然十分重要。

要簡單理解棧的存取方式,我們可以通過類比乒乓球盒子來分析。如下圖左側。

詳解JS內存空間

乒乓球盒子與棧類比

這種乒乓球的存放方式與棧中存取數據的方式如出一轍。處于盒子中最頂層的乒乓球5,它一定是最后被放進去,但可以最先被使用。而我們想要使用底層的乒乓球1,就必須將上面的4個乒乓球取出來,讓乒乓球1處于盒子頂層。這就是棧空間先進后出,后進先出的特點。圖中已經詳細的表明了棧空間的存儲原理。

堆存取數據的方式,則與書架與書非常相似。

書雖然也整齊的存放在書架上,但是我們只要知道書的名字,我們就可以很方便的取出我們想要的書,而不用像從乒乓球盒子里取乒乓一樣,非得將上面的所有乒乓球拿出來才能取到中間的某一個乒乓球。好比在JSON格式的數據中,我們存儲的key-value是可以無序的,因為順序的不同并不影響我們的使用,我們只需要關心書的名字。

二、變量對象與基礎數據類型

JavaScript的執行上下文生成之后,會創建一個叫做變量對象的特殊對象(具體會在下一篇文章與執行上下文一起總結),JavaScript的基礎數據類型往往都會保存在變量對象中。

嚴格意義上來說,變量對象也是存放于堆內存中,但是由于變量對象的特殊職能,我們在理解時仍然需要將其于堆內存區分開來。

基礎數據類型都是一些簡單的數據段,JavaScript中有5中基礎數據類型,分別是Undefined、Null、Boolean、Number、String。基礎數據類型都是按值訪問,因為我們可以直接操作保存在變量中的實際的值。

三、引用數據類型與堆內存

與其他語言不通,JS的引用數據類型,比如數組Array,它們值的大小是不固定的。引用數據類型的值是保存在堆內存中的對象。JavaScript不允許直接訪問堆內存中的位置,因此我們不能直接操作對象的堆內存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。因此,引用類型的值都是按引用訪問的。這里的引用,我們可以粗淺地理解為保存在變量對象中的一個地址,該地址與堆內存的實際值相關聯。

為了更好的搞懂變量對象與堆內存,我們可以結合以下例子與圖解進行理解。

var a1 = 0; // 變量對象var a2 = ’this is string’; // 變量對象var a3 = null; // 變量對象var b = { m: 20 }; // 變量b存在于變量對象中,{m: 20} 作為對象存在于堆內存中var c = [1, 2, 3]; // 變量c存在于變量對象中,[1, 2, 3] 作為對象存在于堆內存中

詳解JS內存空間

上例圖解

因此當我們要訪問堆內存中的引用數據類型時,實際上我們首先是從變量對象中獲取了該對象的地址引用(或者地址指針),然后再從堆內存中取得我們需要的數據。

理解了JS的內存空間,我們就可以借助內存空間的特性來驗證一下引用類型的一些特點了。

在前端面試中我們常常會遇到這樣一個類似的題目

// demo01.jsvar a = 20;var b = a;b = 30;// 這時a的值是多少?// demo02.jsvar m = { a: 10, b: 20 }var n = m;n.a = 15;// 這時m.a的值是多少

在變量對象中的數據發生復制行為時,系統會自動為新的變量分配一個新值。var b = a執行之后,a與b雖然值都等于20,但是他們其實已經是相互獨立互不影響的值了。具體如圖。所以我們修改了b的值以后,a的值并不會發生變化。

詳解JS內存空間

demo01圖解

在demo02中,我們通過var n = m執行一次復制引用類型的操作。引用類型的復制同樣也會為新的變量自動分配一個新的值保存在變量對象中,但不同的是,這個新的值,僅僅只是引用類型的一個地址指針。當地址指針相同時,盡管他們相互獨立,但是在變量對象中訪問到的具體對象實際上是同一個。如圖所示。

因此當我改變n時,m也發生了變化。這就是引用類型的特性。

詳解JS內存空間

demo02圖解

通過內存的角度來理解,是不是感覺要輕松很多。除此之外,我們還可以以此為基礎,一步一步的理解JavaScript的執行上下文,作用域鏈,閉包,原型鏈等重要概念。其他的我會在以后的文章慢慢總結,敬請期待。

內存空間管理

因為JavaScript具有自動垃圾收集機制,所以我們在開發時好像不用關心內存的使用問題,內存的分配與回收都完全實現了自動管理。但是根據我自己的開發經驗,了解內存機制有助于自己清晰的認識到自己寫的代碼在執行過程中發生過什么,從而寫出性能更加優秀的代碼。因此關心內存是一件非常重要的事情。

JavaScript的內存生命周期

1. 分配你所需要的內存

2. 使用分配到的內存(讀、寫)

3. 不需要時將其釋放、歸還

為了便于理解,我們使用一個簡單的例子來解釋這個周期。

var a = 20; // 在內存中給數值變量分配空間alert(a + 100); // 使用內存var a = null; // 使用完畢之后,釋放內存空間

第一步和第二步我們都很好理解,JavaScript在定義變量時就完成了內存分配。第三步釋放內存空間則是我們需要重點理解的一個點。

JavaScript有自動垃圾收集機制,那么這個自動垃圾收集機制的原理是什么呢?其實很簡單,就是找出那些不再繼續使用的值,然后釋放其占用的內存。垃圾收集器會每隔固定的時間段就執行一次釋放操作。

在JavaScript中,最常用的是通過標記清除的算法來找到哪些對象是不再繼續使用的,因此a = null其實僅僅只是做了一個釋放引用的操作,讓 a 原本對應的值失去引用,脫離執行環境,這個值會在下一次垃圾收集器執行操作時被找到并釋放。而在適當的時候解除引用,是為頁面獲得更好性能的一個重要方式。

在局部作用域中,當函數執行完畢,局部變量也就沒有存在的必要了,因此垃圾收集器很容易做出判斷并回收。但是全局變量什么時候需要自動釋放內存空間則很難判斷,因此在我們的開發中,需要盡量避免使用全局變量,以確保性能問題。要詳細了解垃圾收集機制,建議閱讀《JavaScript高級編程》中的4.3節

以上就是詳解JS內存空間的詳細內容,更多關于JS內存空間的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费人成精品欧美精品| 久久精品二区三区| 精品国产午夜| 亚洲性视频h| 亚洲精品欧美| 成人精品视频| 男女男精品视频网| 国产成人精品一区二区三区视频| 国产亚洲永久域名| 精品国产鲁一鲁****| 欧美日韩四区| 国产精品红桃| 日韩午夜免费| 久久精品二区亚洲w码| 国产精品毛片| 激情黄产视频在线免费观看| 免费看日韩精品| 日韩欧美二区| 国产人成精品一区二区三| 久久精品国产亚洲夜色av网站| 日本va欧美va欧美va精品| 99久久久久国产精品| 欧美一级二级视频| 黄色欧美日韩| 中文字幕高清在线播放| 日韩精品欧美大片| 欧洲激情综合| 国产在线视频欧美一区| 亚洲区第一页| 欧美日韩国产在线一区| 麻豆网站免费在线观看| 欧美亚洲自偷自偷| 亚洲一区日本| 欧美日韩水蜜桃| 老鸭窝一区二区久久精品| 石原莉奈一区二区三区在线观看| 国产aa精品| 日韩精品福利一区二区三区| 99久久久久国产精品| 国产伦精品一区二区三区视频 | 日本高清久久| 欧美91视频| 国产91欧美| 奇米色欧美一区二区三区| 亚洲欧美视频| 日韩欧美二区| 激情综合婷婷| 国产欧美视频在线| 日本视频一区二区| 免费在线观看一区二区三区| 国产精品v亚洲精品v日韩精品| 影音先锋久久精品| 在线一区电影| 九色精品91| 日韩大片免费观看| 精品国产精品久久一区免费式 | 久久中文字幕一区二区三区| 在线免费观看亚洲| 亚洲精品888| 久久久9色精品国产一区二区三区| 乱一区二区av| 美日韩一区二区三区| 国产乱码精品一区二区三区亚洲人| 蜜臀国产一区二区三区在线播放| 欧美成人国产| 91看片一区| 九色porny丨国产首页在线| 韩国女主播一区二区三区| 国产免费久久| 国产精品成人自拍| 欧美韩一区二区| 国产精品99久久免费| 久久精品超碰| 国产日韩中文在线中文字幕| 国产欧美69| 美女视频黄久久| 国产精品99一区二区三| 亚洲黄色免费看| 欧美成人日韩| 成人在线超碰| 国产精品久久观看| 日韩激情一区| 亚洲成人精品| 亚洲深夜av| 亚洲永久精品唐人导航网址| 一区二区亚洲视频| 亚洲精品黄色| 国产日韩三级| 精品视频国产| 99精品综合| 亚洲激情另类| 亚洲精一区二区三区| 日韩高清电影免费| 麻豆久久久久久| 日韩大片在线播放| 香蕉精品久久| 美国三级日本三级久久99| 中文字幕亚洲影视| 国产精品一区二区精品视频观看| 韩日一区二区| 亚洲网站视频| 一区二区三区四区日韩| 清纯唯美亚洲综合一区| 精品视频在线观看网站| 亚洲不卡av不卡一区二区| 欧美成人国产| 一区二区三区午夜视频| 国产精品极品| 99精品视频在线观看免费播放| 日韩中文字幕麻豆| 久久国产人妖系列| 精品久久久网| 日韩一级网站| 国产欧美日韩精品高清二区综合区 | 亚洲欧美久久| 日本一不卡视频| 成人在线视频区| 国产亚洲一级| 国产精品日本一区二区三区在线| 国产白浆在线免费观看| 9色精品在线| 国产精品一级| 国产一区视频在线观看免费| 亚洲日本国产| 日本欧美国产| 中文一区二区| 午夜欧美精品久久久久久久| 欧美一级二级视频| 欧美国产美女| 日韩中文字幕区一区有砖一区| 国产日韩欧美一区二区三区在线观看 | 99国内精品| 欧美影院精品| 欧美综合另类| 国产麻豆一区二区三区| 久久久精品久久久久久96 | 99精品99| 国产一区二区三区黄网站| 亚洲女同中文字幕| 国产精品99精品一区二区三区∴ | 亚洲一区欧美激情| 麻豆成人在线观看| 久久国产66| jizzjizz中国精品麻豆| 日韩免费精品| 久久精品免费一区二区三区| 91嫩草精品| 一区免费在线| 裤袜国产欧美精品一区| 涩涩涩久久久成人精品| 久久精品国内一区二区三区水蜜桃| 日本视频一区二区| 亚洲精品2区| 成人福利视频| 国产毛片一区二区三区| 国产模特精品视频久久久久| 91亚洲人成网污www| 国产探花一区在线观看| 中国女人久久久| 欧洲亚洲一区二区三区| 国产精品xxx| 亚洲丝袜美腿一区| 亚洲午夜在线| 国产91在线播放精品| 欧美亚洲人成在线| 亚洲在线一区| 日韩国产网站| 国内自拍视频一区二区三区| 亚洲tv在线| 黄色免费成人| a国产在线视频| 欧美经典一区| 国产调教一区二区三区| 亚洲久久在线| 国产精品日韩| 99久久久久| 黄色aa久久| 精品99在线| 国产福利资源一区| 日本中文字幕一区二区视频| 亚洲欧美日韩精品一区二区| 免费观看久久av| 欧美sss在线视频| 国产理论在线| 国产成人精品三级高清久久91| 久久av中文| 国产免费av一区二区三区| 日韩av中文字幕一区二区| 综合一区在线| 亚洲日产国产精品| 视频一区在线播放| 狠狠爱www人成狠狠爱综合网| 久久九九99| 久久久国产精品一区二区中文| 中文字幕成在线观看| 欧产日产国产精品视频| 日韩欧美国产精品综合嫩v| 精品三级国产| av中文字幕在线观看第一页| 亚洲性色av|