JavaScript學習之JSON對象

JSON對象

補充記錄一下,有些方法很須要熟練記憶的javascript

JSON對象的規定

JSON對象對值有嚴格的規定java

複合類型的值只能是數組或對象,不能是函數、正則表達式對象、日期對象。
原始類型的值只有四種:字符串、數值(必須以十進制表示)、布爾值和null(不能使用NaN, Infinity, -Infinity和undefined)。
字符串必須使用雙引號表示,不能使用單引號。
對象的鍵名必須放在雙引號裏面。
數組或對象最後一個成員的後面,不能加逗號。

我對這段話的理解是:正則表達式

  • JSON對象的值是一個值,必須是類型string,number,bool,null,array以及object;對於array與object,應該是咱們常常自定義的{}與[]類型的對象和數組
  • string類型的值必須是雙引號,因此也就包括了object中的鍵名必須用雙引號
  • 數值必須以十進制表示
  • 若是值爲數組或者對象,那麼其鍵值類型必須符合第一條;
  • 通常數組或者對象最後寫逗號也會忽略,而JSON對象則不容許寫

JSON.stringify(n)

該方法用來將參數值轉化爲JSON字符串數組

  • 參數類型string
    返回呆雙引號的參數值;之因此加爲了知道參數是string轉化過來的JSON.stringify("javascript"); //"javascript"
  • 參數類型爲number函數

    console.log(JSON.stringify(1));                 // 1
    console.log(JSON.stringify(0XFFF));             //4095
    console.log(JSON.stringify(Infinity));          //null
    console.log(JSON.stringify(NaN));               //null
  • 參數類型boolprototype

    console.log(JSON.stringify(false));            //false
    console.log(JSON.stringify(true));             //true
  • 參數類型null,返回字符串null;JSON.stringify("null"); //null
  • 參數類型undefined,單純一個undefined值時,會忽略直接返回自身undefined,不是字符串undefined
  • 參數類型Symbol,同上undefined如出一轍
  • 參數類型數組code

    JSON.stringify([1,null,NaN,undefined,function () {},(new Date()),,]);
    //             [1,null,null,null,    null,          "2018-11-02T15:22:53.482Z", null]

    注意空位會返回nullxml

  • 參數類型對象對象

    console.log(JSON.stringify({"a":1,"b":undefined}));                     //{"a":1}  忽略undefined鍵值
    console.log(JSON.stringify({"a":null,"b":NaN}));                        //{"a":null,"b":null} NaN與Infinity返回null
    console.log(JSON.stringify({"a":function () {},"b":(new Date())}));     //{"b":"2018-11-02T15:27:13.886Z"} 忽略undefined鍵值

    當對象中有不可遍歷屬性時,跳過該屬性ip

JSON.stringify(n,m)

它的第二個參數可填入數組或者函數

  • 參數爲數組時,僅適用於第一個參數爲對象時纔有效;其對象包括數組
    起到過濾的效果,留咱們本身想要的鍵值對

    console.log(JSON.stringify({a : 1, b : 2}, ["b"]));         //{b : 2}
  • 參數爲函數:

    JSON.stringify({ a: 1, b: [1, 2] }, (key, value) => {
      console.log(key + ":" + value);
      return value;
    }); 
    /*      
    :[object Object]
    a:1
    b:1,2
    0:1
    1:2
    */

    由例子能夠看出,一共執行了5次
    第一次執行將參數總體做爲value,key爲空;
    剩餘每次都按更加value的值進行下一次執行;
    若value爲對象,會執行完對象中的第一個成員,再去執行第二個成員,直到沒有value
    返回值,我認爲它是經過value把參數遍歷一遍,將value填入相應位置,將其返回

  • 因爲上面的特性能夠實現深拷貝
    可是有缺陷,當鍵值爲undefined,函數,Symbol類型或者xml,以及不可遍歷元素;都會將其忽略

toJSON 方法

JSON.stringify()正是調用了toJSON方法;因此對其進行改造能夠改變輸出
例如當參數爲正則時,會返回空對象

JSON.stringify(/aa/) // {}
RegExp.prototype.toJSON = RegExp.prototype.toString;
JSON.stringify(/aa/) // "/aa/"

JSON.parse()

該方法則是將JSON.stringify()生成的結果還原

JSON.parse(JSON.stringify("123"));  //123
JSON.parse(JSON.stringify(undefined));  //報錯不是JSON對象
相關文章
相關標籤/搜索