使用fast-json-stringify代替JSON.stringify
阿新 • • 發佈:2018-12-22
使用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。因為模式是固定的,那麼定義模式的空間開銷一定比使用該模式生成字串的時間開銷代價要小很多。