你不知道的JSON.stringify

写在前面:原谅我这个菜鸡在学了两三年前端对js基础还是很多盲区(哭唧唧)。在写这篇文章的时候真的超级庆幸还好当初面试官没问到这种问题。

JSON.stringify(value[, replacer [, space]])

JSON.stringify()

  • undefinedSymbol任意函数作为对象属性被JSON序列化时,会跳过对他们的序列化
  • undefinedSymbol任意函数作为数组元素被JSON序列化时,会被转化为null
  • undefinedSymbol任意函数 直接被JSON序列化时,会被转化为undefined

由于第一条特性,所以JSON在序列化对象时,不能保证对象属性是按顺序输出的(因为有的属性会被跳过)

JSON.stringify()序列化含toJSON属性的对象,将会返回toJSON()的返回值

1
2
3
4
5
6
7
8
const obj = {
say: "this is a demo",
toJSON: function(){
return 'json results'
}
};

console.log(JSON.stringify(obj)); // json results

JSON.stringify()会正常序列化Date的值,因为Date对象内置有toJSON()方法。

NaNInfinity格式的数值及null都会被当作null

基本包装类型会被序列化为最原始的基本类型

其他类型的对象被,如(Map/Set等)仅会序列化可枚举的属性(enumerable)

1
2
3
4
5
6
7
8
9
10
11
JSON.stringify(
Object.create(
null,{
x:{value:"12345", enumberable:false},
y:{value:"fighting", enumberable:true}
}
)
)


// "{"y":{"value":"fighting"}}"

JSON.stringify()的第二个参数replacer

replacer作为函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

const data = {
a: 1,
b: 2,
c: 3,
d: 4
}

JSON.stringify(data,(key,value)=>{
console.log(value);
return value
})

// 这里可以看出,第二个参数是函数时,打印出了value,而value并不是每个对象的属性value,第一个value是原对象的键值对

// {a: 1, b: 2, c: 3, d: 4}
// 1
// 2
// 3
// 4
"{"a":1,"b":2,"c":3,"d":4}"

replacer作为数组

数组的值就代表了被序列化曾JSON字符串的属性名

1
2
3
4
5
6
7
8
const data = {
a: 1,
b: 2,
c: 3,
d: 4
}
JSON.stringify(data,['a','c'])
// "{"a":1,"c":3}"

space

用来控制序列化之后字符串的间距

-------------本文结束感谢您的阅读-------------