JSON.parse和JSON.stringify的巧用

JSON.parse和JSON.stringify是對json數據的轉換,在js中使用的頻率仍是很是高的,好比localStorage,cookie中對複合型數據的存儲,與服務器進行數據交互的格式轉換等等。json

JSON.stringify()是將一個JavaScript值(對象或者數組)轉換爲一個json字符串,若是指定了 replacer 是一個函數,則能夠選擇性地替換值,或者若是指定了 replacer 是一個數組,則可選擇性地僅包含數組指定的屬性。

語法:數組

JSON.stringify(value[, replacer [, space]])

value:要進行轉換的JSON對象;
replacer|可選:若是該參數是一個函數,則在序列化過程當中,被序列化的值的每一個屬性都會通過該函數的轉換和處理;若是該參數是一個數組,則只有包含在這個數組中的屬性名纔會被序列化到最終的 JSON 字符串中;若是該參數爲 null 或者未提供,則對象全部的屬性都會被序列化;
space|可選:指定縮進用的空白字符串,用於美化輸出服務器

注意:
一、轉換值若是有 toJSON() 方法,該方法定義什麼值將被序列化
二、非數組對象的屬性不能保證以特定的順序出如今序列化後的字符串中。
三、布爾值、數字、字符串的包裝對象在序列化過程當中會自動轉換成對應的原始值。
四、 undefined、任意的函數以及 symbol 值,在序列化過程當中會被忽略(出如今非數組對象的屬性值中時)或者被轉換成 null(出如今數組中時)。函數、undefined 被單獨轉換時,會返回 undefined。
五、對包含循環引用的對象(對象之間相互引用,造成無限循環)執行此方法,會拋出錯誤。
六、以 symbol 爲屬性鍵的屬性都會被徹底忽略掉,即使 replacer參數中強制指定包含了它們
七、Date 日期調用了 toJSON() 將其轉換爲了 string 字符串(同Date.toISOString()),所以會被當作字符串處理。
八、NaN 和 Infinity 格式的數值及 null 都會被當作 null。
JSON.stringify({});                        // '{}'
JSON.stringify(true);                      // 'true'
JSON.stringify("foo");                     // '"foo"'
JSON.stringify([1, "false", false]);       // '[1,"false",false]'
JSON.stringify({ x: 5 });                  // '{"x":5}'

JSON.stringify([undefined, Object, Symbol("")]);          
// '[null,null,null]'

replacer參數
replacer 參數能夠是一個函數或者一個數組。做爲函數,它有兩個參數,鍵(key)和值(value),它們都會被序列化。cookie

const user = { id: 229, name: "John", email: "john@awesome.com" };
 function replacer(key, value) {
      console.log(typeof value);
      if (key === "email") {
        return undefined;
      }
      return value;
}
 const userStr = JSON.stringify(user, replacer); // "{"id":229,"name":"John"}"
JSON.parse()用來解析JSON字符串,構造由字符串描述的JavaScript值或對象。提供可選的 reviver函數用以在返回以前對所獲得的對象執行變換

語法:函數

JSON.parse(text\[, reviver\])

text:要被轉換的JSON字符串;
reviver|可選:轉換器, 若是傳入該參數(函數),能夠用來修改解析生成的原始值,調用時機在 parse 函數返回以前。ui

const user = {
    name: "John",
    email: "john@awesome.com",
    plan: "Pro"
};

const userStr = JSON.stringify(user);
JSON.parse(userStr, (key, value) => {
    if (typeof value === "string") {
          return value.toUpperCase();
    }
  return value;
});

技巧

一、判斷兩個引用數據類型是否相等spa

var arr1=[1,2];
var arr2=[1,2];
console.log(arr1===arr2);//false
console.log(JSON.stringify(arr1)===JSON.stringify(arr2));//true

二、實現引用類型數據深拷貝debug

var arr1=[1,2];
var arr2=arr1;
arr2[1]=0;
console.log(arr1);//[1,0]

正常狀況下拷貝數組會互相影響,使用JSON.stringify()後code

var arr1=[1,2];
var arr3=JSON.stringify(arr1);
arr3=JSON.parse(arr3);
arr3[1]=0;
console.log(arr1);//[1,2]

三、引用類型數據存儲對象

var account={
  uid:123,
  name:"jack"
};
window.localStorage.setItem("account",JSON.stringify(account));

四、debug處理
有時候在客戶端內沒法打印oject數據查看異常,沒法定位問題,好比:

var account={
  uid:123,
  name:"jack"
};
alert(account);//[object,object]
alert(JSON.stringify(account));//{"uid":123,"name":"jack"}
相關文章
相關標籤/搜索