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对象
相关推荐
LauraRan 2020-09-28
nmgxzm00 2020-11-10
ifconfig 2020-10-14
hhanbj 2020-11-17
zfszhangyuan 2020-11-16
古叶峰 2020-11-16
一个智障 2020-11-15
jipengx 2020-11-12
81427005 2020-11-11
xixixi 2020-11-11
游走的豚鼠君 2020-11-10
苗疆三刀的随手记 2020-11-10
Web卓不凡 2020-11-03
小飞侠V 2020-11-02
帕尼尼 2020-10-30
爱读书的旅行者 2020-10-26
帕尼尼 2020-10-23
杏仁技术站 2020-10-23