JSON.stringify()的作用:是将 JavaScript 对象转换为 JSON 字符串。
json.parse()的作用:是将 JSON 字符串转换为 javaScript对象。
json.stringify()与json.parse()的几种妙用手法
一、实现对象的深拷贝
var a = [1,2,3];
let b = JSON.parse(JSON.stringify(a));
b[0] = 9;
console.log(a,b); //[1,2,3] [9,2,3]
原理:利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象;
序列化:序列化的作用是存储(对象本身存储的只是一个地址映射,如果断电,对象将不复存在,因此需将对象的内容转换成字符串的形式再保存在磁盘上 )和传输(例如 如果请求的Content-Type
是 application/x-www-form-urlencoded
,则前端这边需要使用qs.stringify(data)
来序列化参数再传给后端,否则后端接受不到; ps: Content-Type
为 application/json;charset=UTF-8
或者 multipart/form-data
则可以不需要 ;
运用此方法进行深拷贝需要注意以下几点:
- 如果obj里面存在时间对象,JSON.parse(JSON.stringify(obj))之后,时间对象变成了字符串。
var a = new Date(); let b = JSON.parse(JSON.stringify(a)); console.log(a,b); //Sat May 08 2021 11:49:23 GMT+0800 (中国标准时间) "2021-05-08T03:49:23.059Z"
你也可以用这个方法准换时间格式(不要忘记加8小时哦)
- 如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象。
- 如果obj里有函数,undefined,则序列化的结果会把函数, undefined丢失。
- 如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null。
- JSON.stringify()只能序列化对象的可枚举的自有属性。如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor。
- 如果对象中存在循环引用的情况也无法正确实现深拷贝。
二、让localStorage/sessionStorage可以存储对象。
localStorage/sessionStorage默认只能存储字符串,而实际开发中,我们往往需要存储的数据多为对象类型,那么这里我们就可以在存储时利用json.stringify()将对象转为字符串,而在取缓存时,只需配合json.parse()转回对象即可。
实际上存储的是json字符串
//存
function setLocalStorage(key,val){
window.localStorage.setItem(key,JSON.stringify(val));
};
//取
function getLocalStorage(key){
let val = JSON.parse(window.localStorage.getItem(key));
return val;
};
//测试
setLocalStorage('demo',[1,2,3]);
let a = getLocalStorage('demo');//[1,2,3]
三、判断数组是否包含某对象,或者判断对象是否相等。(只是判断对象内容是否相同,检查是否含有某对象,也是检查其中内容)
利用JSON.stringify将对象/数组转成字符串,再用indexOf查找即可
//判断数组是否包含某对象
let data = [
{name:'aaa'},
{name:'张三'},
{name:'李四'},
],
var val = {name:'张三'};
JSON.stringify(data).indexOf(JSON.stringify(val)) !== -1;//true
//判断两数组/对象是否相等
let a = [1,2,3],
b = [1,2,3];
JSON.stringify(a) === JSON.stringify(b);//true