使用JSON.stringify的思考
使用過JSON對象的程序員最常做的一項工作便是,將JSON對象轉化爲字符串。該字符串的用途很多,例如可以使用在WEB的URL中,在多個頁面間進行傳遞。
const obj = { id: 1, name: 'object' };
const jsonStr = JSON.stringify(obj); // 轉換爲字符串
const json = JSON.parse(jsonStr); // 解析字符串爲JSON對象
對於這個轉換過程我們用的太得心應手,所以很少再去思考這中間是否還有需要優化的地方。
其實只要稍微深入思考一點,即使不讀源代碼,我們也能得出這樣一個結論:在JSON對象轉化爲字符串時,是需要去識別某種模式的。
- 對於string類型,需要用雙引號(")去標註
- 對於number類型,不需要標註
- 對於object類型,它的每個屬性間需要用逗號(,)去分隔,並且需要雙引號(")進行標註
- 對於array類型,則還需要加上"["和"]"來表示
例如:
const obj = [{ id: 1, name: 'kobe' }, { id: 2, name: 'wade' }];
const jsonStr = JSON.stringify(obj); // 結果爲:[{"id":"1,"name":"kobe"},{"id":2,"name":"wade"}]
所以,如果要你去實現這樣一個stringify的過程,這些類型的識別和標註都是不可避免的花銷。
使用fast-json-stringify
就是在這樣一個邏輯小片段上,fast-json-stringify想到了提高stringify效率的方案:提前定義要轉換對象的模式,那麼就可以省去解析模式的時間開銷。
const fastJson = require('fast-json-stringify');
const stringify = fastJson({
title: 'player',
type: 'object',
properties: {
name: { type: 'string' },
position: { type: 'string' },
age: { type: 'integer' }
}
});
console.log(stringify({ name: 'kobe', position: 'SG', age: 39 })); // {"name":"kobe","position":"SG","age":39}
從官網的介紹來看,在某些情況下使用fast-json-stringify的效果可以比JSON.stringify快接近10倍!
使用場景
基於fast-json-stringify的優化內容,我們很容易得出這樣一個結論:在所有經常需要對某些固定模式進行stringify的場合,都適合使用fast-json-stringify。因爲模式是固定的,那麼定義模式的空間開銷一定比使用該模式生成字符串的時間開銷代價要小很多。