JSON.stringify方法
JSON.stringify 方法说明
本章,我们主要针对JSON.stringify方法进行介绍,方便我们日常中查阅!
简要说明
在日常的开发中,我们经常会用到JSON.stringify方法将 JSON 对象或数组转换为对应的字符串,方便传递到后端进行存储。
但是在通常情况下,我们只会用到了一个参数,如:JSON.stringify({a:1,b:2})。
其实JSON.stringify方法还可以传递第二个和第三个参数进去,以实现个性化需求。
具体用法见如下文档。
1、第二个参数
JSON.stringify方法可以传第二个参数,该参数类型为字符串数组,传递的字符串就是 JSON 对象中的 Key 名称。
如下代码所示,传递的第二个参数为:["name", "age"],就代表序列化为字符串时只会保留name和age属性,email会被删除掉:
const userObj = {
name: '张三',
age: 18,
email: 'zhangs@163.com',
};
console.log(JSON.stringify(userObj, ['name', 'age']));

2、第三个参数(数字类型)
JSON.stringify方法可以传第三个参数,并且该参数类型为数字,该参数代表序列化为字符串后每个 Key 前面缩进的空格个数。
如下代码所示,传递的第三个参数分别为 2、4、6,代表序列化为字符串后每个 Key 前面缩进的空格个数分别为 2 个、4 个和 6 个:
const userObj = {
name: '张三',
age: 18,
email: 'zhangs@163.com',
};
console.log(JSON.stringify(userObj, null, 2));
console.log(JSON.stringify(userObj, null, 4));
console.log(JSON.stringify(userObj, null, 6));

3、第三个参数(字符串类型)
JSON.stringify方法可以传第三个参数,并且该参数类型为字符串,该参数代表序列化为字符串后每个 Key 前面缩进占位的“该字符串”个数(传了几个字符串,就代表用几个该字符串占位)。
如下代码所示,传递的第三个参数分别为 "--"、"----"、"------",代表序列化为字符串后每个 Key 前面缩进占位的字符"-"个数分别为 2 个、4 个和 6 个:
const userObj = {
name: '张三',
age: 18,
email: 'zhangs@163.com',
};
console.log(JSON.stringify(userObj, null, '--'));
console.log(JSON.stringify(userObj, null, '----'));
console.log(JSON.stringify(userObj, null, '------'));

4、toJSON 方法
如果 JSON 对象中包含有toJSON方法,则在序列化为字符串后会返回toJSON方法中的返回结果。
如下代码所示,则在序列化为字符串后返回的结果值为"姓名:张三,年龄:18":
const userObj = {
name: '张三',
age: 18,
email: 'zhangs@163.com',
toJSON: function () {
return `姓名:${this.name},年龄:${this.age}`;
},
};
console.log(JSON.stringify(userObj));

5、JSON.stringify 局限性
JSON.stringify 局限性
在某些场景下,我们可能会使用JSON.stringify去做深拷贝。
此时就需要注意了,因为在使用JSON.stringify做深拷贝后,会忽略掉很多类型的 Key,如:undefined、function和Symbol等。
具体说明如下代码所示:
const userObj = {
a: undefined,
b: function () {},
c: () => {},
d: Symbol(),
e: new RegExp(),
f: null,
g: NaN,
h: Infinity,
i: '张三',
j: new Date(),
k: true,
l: 100,
};
console.log(JSON.stringify(userObj));

从上述例子中,我们可以看出如下问题:
Key(a、b、c 和 d):
undefined、function、箭头函数和Symbol直接被忽略掉了;Key(e):正则表达式转换为了对象;
Key(j):日期转换为了字符串;
Key(g 和 h):NaN 和 Infinity 直接变为了 null。
因此在使用`JSON.stringify`方法做深拷贝的时候需要谨慎!!!
6、循环引用问题
如果 JSON 对象中某个 Key 循环引用了自己,会形成无线循环序列化的问题,从而导致报错的出现。
如下代码所示,就是将对象userObj的object属性值设置为了自身,然后触发浏览器报错:
const userObj = {
name: '张三',
age: 18,
email: 'zhangs@163.com',
object: null,
};
userObj.object = userObj;
console.log(JSON.stringify(userObj));

