JavaScript学习之JSON对象

JSON对象

补充记录一下,有些方法很需要熟练记忆的

JSON对象的规定

JSON对象对值有严格的规定

复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和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
  • 参数类型bool

    console.log(JSON.stringify(false));            //false
    console.log(JSON.stringify(true));             //true
  • 参数类型null,返回字符串null;JSON.stringify("null"); //null
  • 参数类型undefined,单纯一个undefined值时,会忽略直接返回自身undefined,不是字符串undefined
  • 参数类型Symbol,同上undefined一模一样
  • 参数类型数组

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

    注意空位会返回null

  • 参数类型对象

    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键值

    当对象中有不可遍历属性时,跳过该属性

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对象

相关推荐