sss

JSON.stringify方法

Quber...大约 3 分钟JSONstringify

JSON.stringify 方法说明

本章,我们主要针对JSON.stringify方法进行介绍,方便我们日常中查阅!

简要说明

在日常的开发中,我们经常会用到JSON.stringify方法将 JSON 对象或数组转换为对应的字符串,方便传递到后端进行存储。

但是在通常情况下,我们只会用到了一个参数,如:JSON.stringify({a:1,b:2})

其实JSON.stringify方法还可以传递第二个第三个参数进去,以实现个性化需求。

具体用法见如下文档。

1、第二个参数

JSON.stringify方法可以传第二个参数,该参数类型为字符串数组,传递的字符串就是 JSON 对象中的 Key 名称。

如下代码所示,传递的第二个参数为:["name", "age"],就代表序列化为字符串时只会保留nameage属性,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,如:undefinedfunctionSymbol等。

具体说明如下代码所示:

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));

 
 
 
 
 

 
 

 





JSON.stringify局限性
JSON.stringify局限性

从上述例子中,我们可以看出如下问题:

  • Key(a、b、c 和 d):undefinedfunction箭头函数Symbol直接被忽略掉了;

  • Key(e):正则表达式转换为了对象;

  • Key(j):日期转换为了字符串;

  • Key(g 和 h):NaN 和 Infinity 直接变为了 null。


6、循环引用问题

如果 JSON 对象中某个 Key 循环引用了自己,会形成无线循环序列化的问题,从而导致报错的出现。

如下代码所示,就是将对象userObjobject属性值设置为了自身,然后触发浏览器报错:

const userObj = {
    name: '张三',
    age: 18,
    email: 'zhangs@163.com',
    object: null,
};

userObj.object = userObj;

console.log(JSON.stringify(userObj));







 


循环引用问题
循环引用问题