# JSON.stringify()
# 定义
# JSON.stringify(value[, replacer[, space]])
value 将要序列化的值
replacer 可选
- 如果是一个函数,则在序列化过程中,每个值都会经过改函数的转换处理
- 如果是一个数组,则只有包含在这个数组中的属性名才会被序列化
- 如果为null 或 未提供,则所有属性都会被序列化
- space 可选
- 指定缩进用的字符串,用于美化输出
- 如果是数字,表示几个空格,上限为10,小于1则表示没有空格
- 如果是字符串,则表示使用字符串作为空格,长度上限10
# 基本使用
# 对象
const obj1 = {
name: 'Ben',
age: 12
};
// 转换对象
console.log(JSON.stringify(obj1));
// 转换值
console.log(JSON.stringify(true)); // 'true'
console.log(JSON.stringify('hello'));
console.log(JSON.stringify(12));
console.log(JSON.stringify(null) === 'null'); // true
// repalcer
console.log(JSON.stringify(obj1, (key, value) => {
return typeof value === 'number' ? value + '' : value
})); // {"name":"Ben","age":"12"}
// 指定数组
console.log(JSON.stringify(obj1, ['name'])); // {"name":"Ben"}
// space
console.log(JSON.stringify(obj1, null, 2));
// {
// "name": "Ben",
// "age": 12
// }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 数组
const arr = [
{
name: 'zs',
age: 12
},
{
name: 'xm',
age: 13
},
{
name: 'xw',
age: 14
},
]
const a1 = JSON.stringify(arr, ['name'])
console.log(a1); // [{"name":"zs"},{"name":"xm"},{"name":"xw"}]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 特性
# 一
undefined
任意的函数
Symbol
值出现在非数组对象
的属性值中将会被忽略undefined
任意的函数
Symbol
值出现在数组对象
的属性值中将会被转为null
undefined
任意的函数
Symbol
被单独转换时,会返回 undefined
const obj2 = {
name: 'Lee',
age: 10,
sex: undefined,
getName: function() {
},
sym: Symbol('sym'),
}
console.log(JSON.stringify(obj2, null, 2));
// {
// "name": "Lee",
// "age": 10
// }
const arr2 = [
'hello',
12,
function() {},
Symbol('arr'),
undefined
];
console.log(JSON.stringify(arr2)); // ["hello",12,null,null,null]
console.log(JSON.stringify(undefined)); // undefined
console.log(JSON.stringify(function() {})); // undefined
console.log(JSON.stringify(Symbol('sym'))); // undefined
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 二
- NaN Infinity null 都会被当做 null
console.log(JSON.stringify({
nan: NaN,
num: Infinity,
nu: null
})); // {"nan":null,"num":null,"nu":null}
console.log(JSON.stringify([NaN, null, Infinity])); // [null,null,null]
1
2
3
4
5
6
7
2
3
4
5
6
7
# 三
- 转换值如果有
toJSON()
方法,该方法定义什么值将会被序列化
const toJsonObj = {
name: 'hello',
age: 12,
toJSON() {
return {
sex: '1',
id: 6
}
}
}
console.log(JSON.stringify(toJsonObj)); // {"sex":"1","id":6}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 四
- 对包含循环引用的对象,执行此方法,将会报错
const obj4 = {
name: 'hh'
}
obj4.obj = obj4;
console.log(JSON.stringify(obj4)); // Uncaught TypeError: Converting circular structure to JSON
1
2
3
4
5
2
3
4
5
# 五
- 其他类型的对象(Set/Map/WeakSet/WeakMap),仅会序列化可枚举的属性
let obj5 = {};
Object.defineProperties(obj5, {
name: {
value: 'hello',
enumerable: true
},
age: {
value: 12,
enumerable: false
}
})
console.log(JSON.stringify(obj5)); // {"name":"hello"}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12