前段时间勾股有提到stringify是支持三个参数,刷新的了个人认知,后来查到文档才发现还真的是支持三个参数的。javascript
参考资料:java
stringify方法顾名思义,就是把JSON序列换,其语法以下:数组
JSON.stringify(value[, replacer [, space]])
注意到它接收三个参数,后面2个参数是可选的。函数
1 var data = {name:"niuzai",info:{age:18,sex:"male"}}; 2 3 JSON.stringify(data); //{"name":"niuzai","info":{"age":18,"sex":"male"}}
这里要注意:stringily对data里的数据类型有一些要求:spa
1 JSON.stringify({x: 5, y: 6}); 2 // '{"x":5,"y":6}' 或者 '{"y":6,"x":5}' 均可能
undefined
、任意的函数以及 symbol 值,在序列化过程当中会被忽略(出如今非数组对象的属性值中时)或者被转换成 null
(出如今数组中时)。1 var obj = {"undefined":undefined,"func":function(){},"symbol":Symbol("")}; 2 JSON.stringify(data); //"{}" 3 4 var arr = [undefined,Symbol(""),function(){}]; 5 JSON.stringify(arr); //[null,null,null]
replacer
参数中强制指定包含了它们。JSON.stringify({[Symbol("foo")]: "foo"}); //'{}'
1 JSON.stringify( Object.create(null, { x: { value: 'x', enumerable: false }, y:{value: 'y', enumerable: true } }) ); 2 // '{"y":"y"}'
第二个参数颇有意思,能够为一个过滤函数,也能够是一个数组。code
当为数组时被序列化的值的每一个属性都会通过该函数的转换和处理,当为数组时则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中。对象
过滤函数仍是比较有意思的,你能够控制输出,好比以前提到的会被忽略的类型,能够在这里人工的处理,强制输出(固然是别的类型)。blog
1 var data = { 2 name:"niuzai", 3 info:{ 4 age:18, 5 sex:"male" 6 } 7 }; 8 9 JSON.stringify(data, function(key, val){ 10 console.log("key is %s", key); 11 console.log("val is %s", typeof(val)); 12 return val; 13 }); 14 //key is 15 //key is 16 //val is object 17 //key is name 18 //val is string 19 //key is info 20 //val is object 21 //key is age 22 //val is number 23 //key is sex 24 //val is string 25 "{"name":"niuzai","info":{"age":18,"sex":"male"}}"
注意:这里必定要return一个值给下一个遍历函数做为参数传入,若是不return的话,后面的遍历就无法玩下去了。ip
1 JSON.stringify(data, ["name", "info", "sex"]); 2 3 //age因为不在列表里,因此没被序列化 4 //"{"name":"niuzai","info":{"sex":"male"}}"
第三参数space
用来控制结果字符串里面的间距。若是是一个数字, 则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格);若是是一个字符串,则每一级别会比上一级别多缩进用该字符串(或该字符串的前十个字符)。文档
1 JSON.stringify(data,null,10); 2 //每个层级比上一个多10个空格 3 "{ 4 "name": "niuzai", 5 "info": { 6 "age": 18, 7 "sex": "male" 8 } 9 }" 10 11 JSON.stringify(data,null,'\t'); 12 //每个层级比上一个多一个制表符 13 "{ 14 "name": "niuzai", 15 "info": { 16 "age": 18, 17 "sex": "male" 18 } 19 }"
若是一个被序列化的对象拥有 toJSON
方法,那么该 toJSON
方法就会覆盖该对象默认的序列化行为
1 var data = { 2 name:"niuzai", 3 info:{ 4 age:18, 5 sex:"male" 6 }, 7 toJSON:function(){ 8 return "by toJSON"; 9 } 10 }; 11 12 JSON.stringify(data); 13 //""by toJSON"";
注意:这里的toJSON必须是一个function,若是是别的类型就不行了,好比以前提到的数组。