JSON.stringify的三个参数

JSON.stringify的三个参数

看大佬写的代码,有看到JSON.stringify传递了三个参数,对这个不熟,就上网查找了一下,刷新的了我的认知,后来查到文档才发现还真的是支持三个参数的。

参考资料

stringify
stringify方法顾名思义,就是把JSON序列换,其语法如下:

JSON.stringify(value[, replacer [, space]])
注意到它接收三个参数,后面2个参数是可选的。

只传一个参数

var data = {name:"niuzai",info:{age:18,sex:"male"}};
JSON.stringify(data); //{"name":"niuzai","info":{"age":18,"sex":"male"}}

这里要注意:stringily对data里的数据类型有一些要求:

非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
就是不能保证hash结构的顺序是按照定义输出

JSON.stringify({x: 5, y: 6});  

// ‘{“x”:5,“y”:6}’ 或者 ‘{“y”:6,“x”:5}’ 都可能

布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。

var obj = {"undefined":undefined,"func":function(){},"symbol":Symbol("")};
JSON.stringify(data); //"{}"
var arr = [undefined,Symbol(""),function(){}];
JSON.stringify(arr); //[null,null,null]

所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们。

JSON.stringify({[Symbol("foo")]: "foo"});   //'{}'    

不可枚举的属性会被忽略

JSON.stringify( Object.create(null, { x: { value: 'x', enumerable: false }, y: { value: 'y', enumerable: true } }) );
// '{"y":"y"}'

两个参数

第二个参数很有意思,可以为一个过滤函数,也可以是一个数组。

当为数组时被序列化的值的每个属性都会经过该函数的转换和处理,当为数组时则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中。

过滤函数
过滤函数还是比较有意思的,你可以控制输出,比如之前提到的会被忽略的类型,可以在这里人工的处理,强制输出(当然是别的类型)。

var data = {
  name:"niuzai",
  info:{
    age:18,
    sex:"male"
  }
};
JSON.stringify(data, function(key, val){
  console.log("key is %s", key);
  console.log("val is %s", typeof(val));
  return val;
});
//key is
//key is 
//val is object
//key is name
//val is string
//key is info
//val is object
//key is age
//val is number
//key is sex
//val is string
"{"name":"niuzai","info":{"age":18,"sex":"male"}}"

注意:这里一定要return一个值给下一个遍历函数作为参数传入,如果不return的话,后面的遍历就没法玩下去了。

数组

JSON.stringify(data, ["name", "info", "sex"]);

age由于不在列表里,所以没被序列化

"{"name":"niuzai","info":{"sex":"male"}}"

三个参数

第三参数space用来控制结果字符串里面的间距。如果是一个数字, 则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格);如果是一个字符串,则每一级别会比上一级别多缩进用该字符串(或该字符串的前十个字符)。

JSON.stringify(data,null,10);

每一个层级比上一个多10个空格

"{
          "name": "niuzai",
          "info": {
                    "age": 18,
                    "sex": "male"
          }
}"
JSON.stringify(data,null,'\t');

每一个层级比上一个多一个制表符

"{
  "name": "niuzai",
  "info": {
    "age": 18,
    "sex": "male"
  }
}"

toJSON 方法

如果一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为

var data = {
  name:"niuzai",
  info:{
    age:18,
    sex:"male"
  },
  toJSON:function(){
    return "by toJSON";
  }
};
JSON.stringify(data);

"“by toJSON”";

注意:这里的toJSON必须是一个function,如果是别的类型就不行了,比如之前提到的数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值