1. 程式人生 > 實用技巧 >JSON.parse 比 Object 字面量語法更快

JSON.parse 比 Object 字面量語法更快

針對太長不看的讀者

因為jsON語法比JavaScript的語法更簡單,因此解析jsON比解析JavaScript更高效。當一個 web app 需要載入在首次載入時,解析一個非常複雜的、大型的、符合JSON規範的物件字面量配置物件時(比如配置 redux 的 store),我們可以根據這一點來提升首屏載入效能。

為什麼JSON.parse更快

使用AST表示JSON.parse(...)更加簡單

在AST中,表示JSON.parse(...)更加簡單,只包含一個型別為CallExpression,一個型別為StringLiteral的token即可。

而表示等價的物件字面量程式碼則複雜的多,複雜程度取決於JSON字串所代表物件的複雜程度,每一個 key 值為一個型別為StringLiteral的token,每一個值為NumericLiteral型別的token,但在js中,這個值實際可以為任何型別。

如果物件包含巢狀結構,則會涉及更多的token以及值型別,這對於JS直譯器來講,將不得不花額外的時間來解析它們以確保程式碼能夠正確執行。

解釋JSON.parse(...)更加簡單

首先來說JSON.parse('{這段程式碼,當直譯器嘗試解釋這段程式碼時,只會遇到兩種情況:

  • 它是一個合法的JSON字串,如果它以{開頭的話
  • 它是一個不合法的JSON字串

而對於{來講,情況就會變得複雜很多,首先來看一段程式碼:

const x = 42
const y = ({ x }

對於這段程式碼,直譯器讀到這個位元組時,無法提前得知後續可能發生的情況。這裡的y真得會是物件字面量,還有可能是其他的情況嗎?如果直譯器不執行後續的程式碼,它無法得出任何結論。

如果第二行程式碼是這樣的:

consty = ({x})

y代表一個物件,而這裡的x指向第一行程式碼中的x變數,它是42。

但如果第二行程式碼是這樣的:

const y = ({ x }={ x: 21 })

這裡的y就會是21,第一個x是用於結構賦值的,它指向後面物件中的那個值為21的x。

這還沒完,如果程式碼是這樣的呢?

const y =({ x })=>x

這裡y則執行一個匿名箭頭函數了,而x代表一個結構賦值引數。

這些例子說明,對於JS引擎來說,解釋一段程式碼,要根據它所處的上下文分析很多事情,而這會花費很多時間,而JSON.parse則更加簡單。

資源搜尋網站大全 https://www.renrenfan.com.cn

廣州VI設計公司https://www.houdianzi.com

benchmark

可以發現在各種不同的 js 引擎中,至少能夠提升1.5x的效能。

使用建議

雖然使用JSON.parse可以提升效能,但是不建議我們通過手動的方式來應用它,主要有以下兩點原因:

  • 使用JSON.parse比使用 Object 字面量可讀性低
  • JSON字串引數無法享受編輯器的高亮效果