JOSN.stringify

JOSN.stringify会忽略的情况:注这里直接会把键一起整个忽略掉,另外循环引用的对象可能会出现Converting circular structure to JSON或者key:undefined情况

JSON.stringify({a:undefined, b:function(){}, c:Symbol()});

// "{}"

console.log(JSON.stringify([undefined,1, function(){}, Symbol(”)]))

// [null,1,null,null]

如果这些值出现的数据中,不会直接忽略而是统一转换成null,以保留数组索引正常

 

1、如果第二个参数是是数组,只有该数组对应键才会被序列化,数据源不受该限制

JSON.stringify(a, [‘c’,’b’])

// "{"c":2,"b":1}"

JSON.stringify([1,2,3], [‘c’,’b’])

// "[1,2,3]"

2、如果是函数,序列化时使用该函数返回的值

JSON.stringify([1,2,3], function(k,v){console.log(k,'=>',v); return typeof v === `number` ? v*2 : v})

 => (3) [1, 2, 3]

0 => 1

0 => 2

0 => 3

"[2,4,6]"

注:回调总共执行了四次,第一次的k为空,值为哦整个初始化对象,

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

MDN文档中并没有提到该点,还要查下文档确定

20180418更新,《你不知道的JavaScript(中卷)》中提到:

如果replacer 是一个函数,它会对对象本身调用一次,然后对对象中的每个属性各调用一次,每次传递两个参数,键和值。如果要忽略某个键就返回undefined,否则返回指定的值。

 

3、第三个参数是,为数字表示缩进量,为字符串缩进就以该字符串

4、另外给对象定义toJSON方法可以作为对象被序列化时的行为

var obj = {

  foo: 'foo',

  toJSON: function () {

    return 'bar';

  }

};

JSON.stringify(obj);      // '"bar"'

JSON.stringify({x: obj}); // '{"x":"bar"}'

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注