json.stringify()与json.parse()的几种妙用

1 篇文章 0 订阅
1 篇文章 0 订阅

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 则可以不需要 ;

运用此方法进行深拷贝需要注意以下几点:

  1. 如果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小时哦)                                                                                                                                         

  2. 如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象。
  3. 如果obj里有函数,undefined,则序列化的结果会把函数, undefined丢失。
  4. 如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null。
  5. JSON.stringify()只能序列化对象的可枚举的自有属性。如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor。
  6. 如果对象中存在循环引用的情况也无法正确实现深拷贝。

二、让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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值