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
benchmark
可以發現在各種不同的 js 引擎中,至少能夠提升1.5x的效能。
使用建議
雖然使用JSON.parse可以提升效能,但是不建議我們通過手動的方式來應用它,主要有以下兩點原因:
- 使用JSON.parse比使用 Object 字面量可讀性低
- JSON字串引數無法享受編輯器的高亮效果