JSON 是一種語法,能夠用來序列化對象、數組或者數字等數據類型。換句話說,咱們能夠利用 JSON 來將數據轉成字符串的形式。javascript
還原被序列化的數據(反序列化),即將字符串還原爲它原本的數據結構。java
參數數組
text
,即將要被「反序列化」的字符串reviver
,處理字符串的回調函數,能夠參與到「反序列化」的過程,遍歷順序是由內到外序列化一個值,即將一個值轉爲字符串的形式。緩存
參數數據結構
value
,將要被序列化的值replacer
函數
常常使用的本地緩存如 localStorage
,對於存入的數據是有要求的:鍵名和值都只能是 string
類型。
而這時 JSON
就能夠派上用場了👇spa
localStorage.set(key, JSON.stringify(data))
localStorage.getItem(key, JSON.parse(str))
若是對象裏有 Date
對象,那麼序列化以後結果是這樣的👇code
"2020-07-29T14:47:09.608Z"
這時候就頭疼了,咱們須要再寫一個函數來處理反序列化以後的結果嗎?
對象
別忘了上面提到的參數,不管是 parse
仍是 stringify
都容許傳入一個參數來控制序列化/反序列化,所以咱們能夠這樣來處理 Date
的對象👇blog
let obj = { text: 'just do it', date: new Date() } let str = JSON.stringify(obj) let org = JSON.parse(str, (key, val) => { // 若是是 date 就轉成 Date if (key === 'date') { return new Date(val) } return val })
如今場景更加複雜了,你須要處理 RegExp
對象了,這時候要怎麼作呢?手快的同窗可能就直接開動了👇
let obj = { reg: /\d+/ } let str = JSON.stringify(obj) let org = JSON.parse(str)
實際上,直接序列化一個 RegExp
對象只會返回一個 "{}"
(不信你試試)
別忘了,RegExp
構造函數能夠傳入這兩個參數:
source
flags
所以咱們只要對包含 RegExp
對象的屬性在序列化與反序列化時作特別處理便可👇
// 序列化 RegExp 對象 let obj = { reg: /\d+/ } let str = JSON.stringify(obj, (key, val) => { if (key === 'reg') { return { source: val.source, flags: val.flags } } return val }) // 反序列化 let org = JSON.stringify(str, (key, val) => { if (key === 'reg') { return new RegExp(val.source, val.flags) } return val })
咱們也能夠利用 JSON.stringify
來判斷某個對象是否爲空(沒有任何屬性)👇
const isObjectEmpty = (obj) => { return JSON.stringify(obj) === '{}' && !obj.__proto__ }