上週,JavaScript 引擎「V8」的開發團隊在該項目官方網站上正式宣佈推出最新的 8.0 版本。此次更新的重點主要集中在錯誤修復及性能改善上,正式的版本將在數週後隨着谷歌 Chrome 80 穩定版一塊兒發佈。git
V8 是谷歌公司推出的開源高性能 JavaScript 引擎,主要用於提高 Web 瀏覽器內部 JavaScript 腳本執行的性能。V8 經過 C++ 語言編寫,主要用在 Chrome 瀏覽器以及 Node.js 上,實現了對 ECMAScript 與 WebAssembly 的支持,可運行於 Windows 七、macOS 10.12 以及使用 x6四、IA-3二、ARM、MIPS 處理器的 Linux 系統,或更新版本的操做系統環境下。V8 既能夠單獨運行,也可以內嵌到任何基於 C++ 的應用中。V8 項目開發至今已擁有超過 11 年的歷史。程序員
V8 引擎的此次更新,對內存佔用量與速度都進行了優化。V8 堆包含了不少東西,例如浮點值、字符串字符、編譯代碼以及標定值,開發團隊發現這些標記值佔據了堆的很大一部分空間。github
標定值與系統指針同樣大,32 位寬度對應 32 位架構,64 位寬度對應 64 位架構。當開發團隊對比 32 位版本與 64 位版本時發現,每一個標記值使用了兩倍的堆內存。segmentfault
由於高位能夠由低位合成,因此只須要將惟一的低位存儲到堆中就能實現下降內存的佔用量,平都可節省 40% 堆內存,這一方法被稱爲「指針壓縮」。數組
一般狀況下,在優化內存佔用的同時也會犧牲部分性能,但通過這一改進以後,在 V8 及其垃圾收集器中卻出現了真實網站的性能提高。瀏覽器
在優化高階內建上,新版本解除了 TurboFan 優化流程中的一處限制,這處限制使高階內建沒法獲得優化。架構
const charCodeAt = Function.prototype.call.bind(String.prototype.charCodeAt); charCodeAt(string, 8);
到目前爲止,對 charCodeAt 的調用對 TurboFan 來講是徹底不透明的,從而引起了對用戶定義函數通用調用。經過這一改變,如今能夠識別出其實是在調用內置 String.prototype.charCodeAt 函數,從而可以觸發 TurboFan 庫中的進一步優化來改善對內建的調用,進而得到與如下相同的性能:app
string.charCodeAt(8);
這一變化也會影響到其餘一些內建,好比 Function.prototype.apply、Reflect.apply,以及不少其餘的高階數組內建。函數
新版本在 JavaScript 方面出現了兩個新特性 ── 可選鏈和 null 判斷合併。性能
在編寫屬性訪問鏈時,程序員常常須要檢查中間值是否爲空。沒有通過錯誤檢查的鏈可能會扔出,而通過了明確的錯誤檢查的鏈是冗長的,而且會產生沒必要要的結果,即檢查全部的真實值,而不是隻檢查非空值。
// Error prone-version, could throw.const nameLength = db.user.name.length;// Less error-prone, but harder to read.let nameLength;if (db && db.user && db.user.name) nameLength = db.user.name.length;
可選鏈(?.)容許程序員編寫更精煉、魯棒性更強的屬性訪問鏈,檢查中間值是否爲空。若是中間值爲空,則整個表達式的計算結果爲未定義的。
// Still checks for errors and is much more readable.const nameLength = db?.user?.name?.length;
除了靜態屬性訪問外,動態屬性訪問和調用也能獲得支持。
null 合併操做符 ?? 是一個新的用於處理默認值的短路二進制操做符。目前,默認值有時由邏輯 || 操做符處理,以下所示:
function Component(props) { const enable = props.enabled || true; // …}
對 || 的使用,並不適合計算默認值,由於當 a 爲非真時 a || b 的結果爲 b。若是 props.enabled 明確被設置爲假,那麼 enable 仍然爲真。
經過 null 合併操做符,當 a 爲空時,a ?? b 的結果爲 b,不然結果爲 a。這是理想的默認值行爲,並使用 ?? 修正了以前提到的錯誤。
function Component(props) { const enable = props.enabled ?? true; // …}
null 合併操做符與可選鏈是相伴而生的特性,可協同工做。當沒有任何 props 參數傳入時,它們能夠對示例進行進一步修改以做爲應對。
function Component(props) { const enable = props?.enabled ?? true; // …}
請經過「git log branch-heads/7.9.. ..branch-heads/8.0 include/v8.h」指令來得到接口變化列表。
開發人員目前可經過指令「git checkout -b 8.0 -t branch-heads/8.0」來體驗 V8 引擎 8.0 版本中的新特性。
相關項目地址:
高性能 JavaScript 引擎 V8 官方網站
高性能 JavaScript 引擎 V8 GitHub 地址