描述
功能⭐
JSON.stringify()方法用于将JavaScript值转换为JSON字符串(文档定义)
通俗来说,就是将value转换为字符串,如果转换过程中需要检索value(键,值的检索,多用于对象某些键的值的修改)可以通过raplacer方法,如果需要修改value的样式(文本添加缩进、空格、换行符或字符)可以使用space参数,详见下述实例说明
JavaScript值:纯值,数组,对象(部分特殊值不支持,下面会讲)
JSON字符串:可以理解为String字符串(便于保存与传输)
语法⭐
JSON.stringify(value[, replacer[, space]])
[ value] 值
[ replacer] 替代品
[ space] 空间,间隔
参数说明
value:(必需) 要转换的 JavaScript 值(通常为对象或数组)。
replacer:(可选)用于转换结果的函数或数组。
如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。
如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。
space:(可选)文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t。
返回值
返回包含JSON文本的字符串(string类型)
实例说明
1️⃣ 只有一个参数
语法
JSON.stringify(value)
功能
value:要进行序列化的 值
1.1 参数为纯值
JSON.stringify(1) //数字
//输出结果:'1'
JSON.stringify("字符串") //字符串
//输出结果:'"字符串"'
JSON.stringify(true) //Boolean
//输出结果:'true'
JSON.stringify(null) //空值
//输出结果:'null'
JSON.stringify({}) //空对象
//输出结果:'{}'
JSON.stringify([]) //空数组
//输出结果:'[]'
JSON.stringify(['terry','larry','tom']) //数组
//输出结果:'["terry","larry","tom"]'
1.2 参数为对象
JSON.stringify({name:'larry',gender:'man',age:18})
//输出结果:'{"name":"larry","gender":"man","age":18}'
//特殊对象
JSON.stringify({undefined:"a"}) //对象中 键 存在undefined
//输出结果:'{"undefined":"a"}'
JSON.stringify({a:undefined,b:11}) //对象中 值 存在undefined
//输出结果:'{"b":11}' //undefined不解析
JSON.stringify({[Symbol("foo")]: "foo"});//对象中 键 存在符号(这里键要加[],不然会报错)
//输出结果:'{}' //不解析
JSON.stringify({a:Symbol("")}) //对象中 值 存在符号
//输出结果:'{}' //不解析
JSON.stringify({a:Object}) //对象中 值 存在函数
//输出结果:'{}' //不解析
JSON.stringify({foo(): "a"}); //对象中 键 存在函数(返回值为)
//输出结果:'{}'/'{"undefined":"a"}'//对象中键存在返回值为Symbol("")的函数,不解析,返回值为undefined,解析方式等同于undefined
JSON.stringify({a:foo()}) //对象中 值 存在函数(无返回值或返回值为undefined/Symble(""))
//输出结果:'{}' //对象中值存在返回值为undefined或Symbol("")的函数,不解析
1.3 特殊参数示例
JSON.stringify() //无参数
//输出结果:undefined
JSON.stringify(undefined) //特殊纯值undefined
//输出结果:undefined
JSON.stringify([null,NaN,Infinity,-Infinity,undefined,Object,Symbol("")])//数组内包含特殊值(NaN,Infinity,-Infinity)
//输出结果:'[null,null,null,null,null,null,null,null]' //NaN,Infinity,-Infinity,Object,Symbol("")会被解析为null,undefined在数组中被解析为null
JSON.stringify([newNumber(1), newString("false"), newBoolean(false),foo()]);//数组内包含数字,字符串,布尔类型的构造函数,以及有返回值的函数(返回值不为undefined,NaN,Infinity,-Infinity),这里我们假设函数返回值为11(数字类型)
//输出结果:'[1,"false",false,11]' //布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值,函数会在执行后对函数返回值进行解析,函数返回值若为(undefined,NaN,Infinity,-Infinity)会被解析为null
注意 ⚠️
1. NaN,Infinity,-Infinity,Object,Symbol("")会被解析为null,undefined在数组中被解析为null
2. 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值,函数会在执行后对函数返回值进行解析,函数返回值若为(undefined,NaN,Infinity,-Infinity)会被解析为null
1.4 参数的可枚举
JSON.stringify(
Object.create(
null,
{
x: { value: 'x', enumerable: false },
y: { value: 'y', enumerable: true }
}
)
);
//输出结果:'{"y":"y"}'
2️⃣ 有两个参数
语法
JSON.stringify(value, replacer)
功能
多针对于value为对象的检索功能
2.1 第二个参数为函数
函数例子(难点)
functionreplacer(key, value) {
if (typeofvalue==="string") {
returnundefined;
}
returnvalue;
}
实例
var a= {foundation: "Mozilla", model: "box", week: 45, month: 7};
JSON.stringify(a, replacer);
//输出结果:{"week":45,"month":7}
2.2 第二个参数为数组(第一个参数为对象)
var a= {name:"larry",gender:"man",age:18,hobby:"run"}
var b= ["age","name"]
JSON.stringify(a,b)
//输出结果:'{"age":18,"name":"larry"}'
3️⃣ 有三个参数
语法
JSON.stringify(value, replacer, space)
功能
space:一个String或Number对象,用于在输出 JSON 字符串(的每项前)插入空格(Number)或字符串(String,包括缩进、换行符等)。|可以提高可读性???(如何操作??)|
3.1 第三个参数为Number(最大为10)
var a= {name:"larry",gender:"man",age:18}
JSON.stringify(a,null,2)
//输出结果:{\n "name":"larry",\n "gender":"man",\n "age":18\n}
//每个键值对前面多了 2个 空格
3.2 第三个参数为string
var a= {name:"larry",gender:"man",age:18}
JSON.stringify(a,null,"text")
//输出结果:{\ntext"name":"larry",\ntext"gender":"man",\ntext"age":18\n}
总结
使用 JSON.stringify() 方法将 JavaScript值 转换为 JSON字符串 的过程,就是将一个在 内存中的变量 转换为 可保存或传输的字符串 的过程,这个过程我们称之为 序列化, 反序列化就需要使用 JSON.parse() 方法
① 对于JavaScript中的五种原始类型,JSON语法支持数字、字符串、布尔值、null四种,不支持undefined;
② unll、NaN、Infinity和-Infinity序列化的结果是null;
③ JSON语法不支持函数Function,undefined,符号Symble(这里指的是value中的函数情况);如果在转换过程中遇到此类任何值,则会省略它们(在对象中找到时)或更改为null(在和数组中找到时)
(特殊的:以下
JSON.stringify()
JSON.stringify(() => {})
JSON.stringify(undefined)
方法返回值均为 undefined)
④ 除了RegExp、Error对象,JSON语法支持其他所有对象;
⑤ 日期对象序列化的结果是ISO格式的字符串,但JSON.parse()依然保留它们字符串形态,并不会将其还原为日期对象;
⑥ JSON.stringify()只能序列化对象的可枚举的自有属性;
在符合以上规则的情况下,还可以通过对象序列化和反序列化完成对象的深拷贝