中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript8的知識點有哪些

發布時間:2022-02-22 17:06:46 來源:億速云 閱讀:122 作者:iii 欄目:開發技術

這篇文章主要介紹“JavaScript8的知識點有哪些”,在日常操作中,相信很多人在JavaScript8的知識點有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JavaScript8的知識點有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

單線程

如果你是一個Node開發者,你應該很熟悉V8的單線程特性。一個 JS 執行上下文與線程數量成正比。

當然,V8在后臺管理操作系統線程機制。它可以與多個線程一起工作,因為它是一個復雜的軟件,可以同時執行許多任務。

但是,V8為每個 JavaScript 的執行上下文只創建一個單線程的環境。其余的都在V8的控制之下。

想象一下 JavaScript 代碼應該進行的函數調用堆棧。 JavaScript 的工作原理是將一個函數堆疊在另一個函數之上,遵循每個函數的插入/調用順序。在到達每個函數的內容之前,我們無法知道它是否調用其他函數。如果發生這種情況,那么被調用的函數將被放在堆棧中調用者的后面。

例如,當涉及回調時,它們被放在堆棧的末尾。

管理這個堆棧組織和進程所需的內存是V8的主要任務之一。

Ignition and TurboFan

自2017年5月發布的5.9版以來,V8 附帶了一個新的JavaScript執行管道,它構建在V8的解釋器Ignition之上。它還包括一個更新和更好的優化編譯器-TurboFan

這些變化完全集中在整體性能上,以及 Google 開發人員在調整引擎以適應 JavaScript 領域帶來的所有快速而顯著的變化時所面臨的困難。

從項目一開始,V8的維護人員就一直在擔心如何在 JavaScript 不斷發展的同時,找到一種提高V8性能的好方法。

Hidden Classes(隱藏類)

這是V8的另一個魔術。JavaScript 是一種動態語言。這意味著可以在執行期間添加、替換和刪除新屬性。例如,在Java這樣的語言中,這是不可能的,在Java中,所有的東西(類、方法、對象和變量)都必須在程序執行之前定義,并且在應用程序啟動后不能動態更改。

由于它的特殊性質,JavaScript 解釋器通常基于散列函數(hash算法)執行字典查找,以準確地知道這個變量或對象在內存中的分配位置。

這對最后一道工序來說代價很大。在其他語言中,當對象被創建時,它們接收一個地址(指針)作為其隱式屬性之一。這樣,我們就可以準確地知道它們在內存中的位置以及要分配多少空間。

對于 JavaScript,這是不可能的,因為我們無法映射出不存在的內容。這就是Hidden Classes發揮作用的地方。

隱藏類與Java中的類幾乎相同:靜態類和固定類具有唯一的地址來定位它們。然而,V8并不是在程序執行之前執行,而是在運行過程中,每次對象結構發生“動態變化”時執行。

讓我們看一個例子來說明問題。考慮以下代碼片段:

function User(name, fone, address) {
   this.name = name
   this.phone = phone
   this.address = address
}

在 JavaScript 基于原型的特性中,每次實例化一個新的用戶對象時,假設:

var user = new User("John May", "+1 (555) 555-1234", "123 3rd Ave")

然后V8創建一個新的隱藏類。我們稱之為_User0

每個對象在內存中都有一個對其類表示的引用。它是類指針。此時,由于我們剛剛實例化了一個新對象,所以在內存中只創建了一個隱藏類。現在是空的。

當你在這個函數中執行第一行代碼時,將在上一個基礎上創建一個新的隱藏類,這次是_User1

它基本上是具有name屬性的User的內存地址。在我們的示例中,我們沒有使用僅將name作為屬性的user,但每次這樣做時,這就是V8將作為引用加載的隱藏類。

name屬性被添加到內存緩沖區的偏移量 0,這意味著這將被視為最后順序中的第一個屬性。

V8還將向_User0隱藏類添加一個轉換值。這有助于解釋器理解:每次向User對象添加name屬性時,必須處理從_User0_User1的轉換。

當調用函數中的第二行時,同樣的過程再次發生,并創建一個新的隱藏類

你可以看到隱藏類跟蹤堆棧。在由轉換值維護的鏈中,一個隱藏類通向另一個。

屬性添加的順序決定了V8將要創建多少個隱藏類。如果您更改我們所創建的代碼段中的行的順序,那么也將創建不同的隱藏類。這就是為什么有些開發人員試圖保持重用隱藏類的順序,從而減少開銷。

Inline Caching(內聯緩存)

這是JIT(Just-in-Time)編譯器中非常常見的一個術語。它與隱藏類的概念直接相關。

例如,每當你調用一個函數,將一個對象作為參數傳遞時,V8會看到這個動作,然后想:“嗯,這個對象作為參數成功地傳遞了兩次或更多次……為什么不把它存儲在我的緩存中以備將來調用,而不是再次執行整個耗時的隱藏類驗證過程?”

讓我們回顧上一個例子:

function User(name, fone, address) { // Hidden class _User0
   this.name = name // Hidden class _User1
   this.phone = phone // Hidden class _User2
   this.address = address // Hidden class _User3
}

當我們將 User 對象的實例兩次作為參數傳遞給函數后,V8將跳轉到隱藏類查找并直接轉到偏移量的屬性。這要快得多。

但是,請記住,如果更改函數中任何屬性賦值的順序,則會導致不同的隱藏類,因此V8將無法使用內聯緩存功能。

這是一個很好的例子,說明開發人員不應該避免更深入地了解引擎。相反,擁有這些知識將有助于代碼更好地執行。

Garbage Collecting(垃圾回收)

你還記得我們提到過V8在另一個線程中收集內存垃圾嗎?這很有幫助,因為我們的程序執行不會受到影響。

V8使用眾所周知的“標記和掃描”策略來收集內存中的舊對象。在這種策略中,GC掃描內存對象以“標記”它們以進行收集的階段有點慢,因為這需要暫停代碼執行。

但是,V8是遞增的,也就是說,對于每個 GC 停頓,V8嘗試標記盡可能多的對象。它使一切變得更快,因為在集合完成之前不需要停止整個執行。在大型應用程序中,性能的提高有很大的不同。

到此,關于“JavaScript8的知識點有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玛纳斯县| 积石山| 滨海县| 都江堰市| 隆林| 东莞市| 闵行区| 长宁县| 仪征市| 都兰县| 桂东县| 营口市| 嵩明县| 黎城县| 资溪县| 曲麻莱县| 调兵山市| 鸡东县| 崇信县| 奉化市| 静乐县| 徐汇区| 昔阳县| 关岭| 贡觉县| 沙湾县| 灵台县| 墨竹工卡县| 水富县| 灵宝市| 三门县| 故城县| 永昌县| 崇左市| 滦南县| 乌鲁木齐市| 芦山县| 义马市| 融水| 梁山县| 宁明县|