JS 中有許多常見的函數,咱們可能天天都在使用它們,可是殊不知道它們的一些額外功能。JSON.stringify
就是這樣的一個函數,今天就來看下它的特殊用法。json
JSON.stringify
方法接收一個變量,並將它轉換成 JSON 表示形式。數組
const boy = { name: 'John', age: 23 }; JSON.stringify(boy); // {"name":"John","age":23}
JSON 就是純字符串,它本質上是 JS 的一個子集,因此並非全部的 JS 對象都能轉換爲 JSON:函數
const boy = { name: 'John', age: 23, hobbies: new Map([[0, 'coding'], [1, 'earn money']]) } JSON.stringify(boy) // {"name":"John","age":23,"hobbies":{}}
上面的例子中 Map 對象就會被忽略並轉換爲普通對象。而若是屬性是函數的話則這個屬性就會被忽略,感興趣的同窗能夠試下。this
JSON.stringify
能夠接收第二個參數,能夠稱爲 replacer
替換器。spa
你能夠傳入一個字符串數組,這個數組中具備的屬性纔會被轉換,就像一個白名單。翻譯
const boy = { name: 'John', age: 23 } JSON.stringify(boy, ['name']) // {"name":"John"}
咱們能夠利用這個特性,只轉換須要轉換的屬性,過濾掉如很長的數組、錯誤對象等。code
這個 replacer
參數還能夠接收一個函數。這個函數會遍歷整個對象,並將鍵和值傳入,讓你決定該如何替換它們。對象
const boy = { name: 'John', age: 23, hobbies: new Map([[0, 'coding'], [1, 'earn money']]) } JSON.stringify(boy, (key, value) => { if (value instanceof Map) { return [...value.values()] } return value }) // {"name":"John","age":23,"hobbies":["coding","earn money"]}
而若是你返回了 undefined
(返回 null
不行),就將這個屬性移除了:blog
JSON.stringify(boy, (key, value) => { if (typeof value === 'string') { return undefined } return value }) // {"age":23,"hobbies":{}}
第三個參數 space
控制了轉換後的 JSON 串的間距。ip
若是參數是數字,則以該數字個數的空格進行縮進:
JSON.stringify(boy, null, 2) // { // "name": "John", // "age": 23, // "hobbies": {} // }
而若是參數是字符串,則以該字符串進行縮進:
JSON.stringify(boy, null, '--') // { // --"name": "John", // --"age": 23, // --"hobbies": {} // }
若是咱們要轉換的對象具備一個 toJSON
方法,那麼就能夠定製本身被序列化的過程。你甚至能夠返回一個新的對象。
const boy = { name: 'John', age: 23, hobbies: new Map([[0, 'coding'], [1, 'earn money']]), toJSON() { return { name: `${this.name} (${this.age})`, favorite: this.hobbies.get(0) } } } JSON.stringify(boy) // {"name":"John (23)","favorite":"coding"}
是否是頗有趣?有時候仔細看一些文檔仍是頗有用的~
歡迎關注個人公衆號:碼力全開(codingonfire)
每週更新一篇原創或翻譯文章~