JSON.stringify()浅析

描述

功能

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()只能序列化对象的可枚举的自有属性;

在符合以上规则的情况下,还可以通过对象序列化和反序列化完成对象的深拷贝

猜你喜欢

转载自blog.csdn.net/yingbbai/article/details/128900638