JSON.parse和JSON.stringify是对json数据的转换,在js中使用的频率仍是很是高的,好比localStorage,cookie中对复合型数据的存储,与服务器进行数据交互的格式转换等等。json
JSON.stringify()是将一个JavaScript值(对象或者数组)转换为一个json字符串,若是指定了 replacer 是一个函数,则能够选择性地替换值,或者若是指定了 replacer 是一个数组,则可选择性地仅包含数组指定的属性。
语法:数组
JSON.stringify(value[, replacer [, space]])
value:要进行转换的JSON对象;
replacer|可选:若是该参数是一个函数,则在序列化过程当中,被序列化的值的每一个属性都会通过该函数的转换和处理;若是该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;若是该参数为 null 或者未提供,则对象全部的属性都会被序列化;
space|可选:指定缩进用的空白字符串,用于美化输出服务器
注意:
一、转换值若是有 toJSON() 方法,该方法定义什么值将被序列化
二、非数组对象的属性不能保证以特定的顺序出如今序列化后的字符串中。
三、布尔值、数字、字符串的包装对象在序列化过程当中会自动转换成对应的原始值。
四、undefined
、任意的函数以及 symbol 值,在序列化过程当中会被忽略(出如今非数组对象的属性值中时)或者被转换成null
(出如今数组中时)。函数、undefined 被单独转换时,会返回 undefined。
五、对包含循环引用的对象(对象之间相互引用,造成无限循环)执行此方法,会抛出错误。
六、以 symbol 为属性键的属性都会被彻底忽略掉,即使replacer
参数中强制指定包含了它们
七、Date 日期调用了 toJSON() 将其转换为了 string 字符串(同Date.toISOString()),所以会被当作字符串处理。
八、NaN 和 Infinity 格式的数值及 null 都会被当作 null。
JSON.stringify({}); // '{}' JSON.stringify(true); // 'true' JSON.stringify("foo"); // '"foo"' JSON.stringify([1, "false", false]); // '[1,"false",false]' JSON.stringify({ x: 5 }); // '{"x":5}' JSON.stringify([undefined, Object, Symbol("")]); // '[null,null,null]'
replacer参数
replacer 参数能够是一个函数或者一个数组。做为函数,它有两个参数,键(key)和值(value),它们都会被序列化。cookie
const user = { id: 229, name: "John", email: "john@awesome.com" }; function replacer(key, value) { console.log(typeof value); if (key === "email") { return undefined; } return value; } const userStr = JSON.stringify(user, replacer); // "{"id":229,"name":"John"}"
JSON.parse()用来解析JSON字符串,构造由字符串描述的JavaScript值或对象。提供可选的 reviver函数用以在返回以前对所获得的对象执行变换
语法:函数
JSON.parse(text\[, reviver\])
text:要被转换的JSON字符串;
reviver|可选:转换器, 若是传入该参数(函数),能够用来修改解析生成的原始值,调用时机在 parse 函数返回以前。ui
const user = { name: "John", email: "john@awesome.com", plan: "Pro" }; const userStr = JSON.stringify(user); JSON.parse(userStr, (key, value) => { if (typeof value === "string") { return value.toUpperCase(); } return value; });
一、判断两个引用数据类型是否相等spa
var arr1=[1,2]; var arr2=[1,2]; console.log(arr1===arr2);//false console.log(JSON.stringify(arr1)===JSON.stringify(arr2));//true
二、实现引用类型数据深拷贝debug
var arr1=[1,2]; var arr2=arr1; arr2[1]=0; console.log(arr1);//[1,0]
正常状况下拷贝数组会互相影响,使用JSON.stringify()后code
var arr1=[1,2]; var arr3=JSON.stringify(arr1); arr3=JSON.parse(arr3); arr3[1]=0; console.log(arr1);//[1,2]
三、引用类型数据存储对象
var account={ uid:123, name:"jack" }; window.localStorage.setItem("account",JSON.stringify(account));
四、debug处理
有时候在客户端内没法打印oject数据查看异常,没法定位问题,好比:
var account={ uid:123, name:"jack" }; alert(account);//[object,object] alert(JSON.stringify(account));//{"uid":123,"name":"jack"}