当前位置: 首页 > ai >正文

前端需要知道的JSON.stringify的正确用法

1、API介绍

MDN官网简介:JSON.stringify(value, replacer, space) 方法将一个 JavaScript 对象或值转换为 JSON 字符串,如果指定了一个 replacer 函数,则可以选择性地替换值,或者指定的 replacer 是数组,则可选择性地仅包含数组指定的属性。

2、常见场景

2.1 存入缓存

在一些存储缓存的场景(如:localStorage、sessionStorage、IndexedDB),不能直接存储对象,此时就需要对该对象进行序列化转化为字符串再进行存储:

let obj = {name: "sishen",age: 18
}
localStorage.setItem("obj", JSON.stringify(obj))

2.2 深拷贝

对对象进行深拷贝,但其中会存在一些陷阱,需要谨慎使用,详情往下看

let obj = {name: "sishen",age: 18,course: {chinese: 98,math: 80}
}
let obj2 = JSON.parse(JSON.stringify(obj))
obj === obj2		// false
obj.course === obj2.course		// false

2.3 对写入文件进行格式化

当我们在使用 nodejs 提供的 fs模块 读取一些 json 文件时,在写入 json文件时 可以防止文件的格式很乱,可以使用 stringify 的第三个参数传入一个数字对输出值做一个格式化处理

JSON.stringify(obj, null, 4) //使用四个空格缩进

3、不能被序列化的属性

在序列化一个对象时,如果该对象包括以下这些值,会导致返回的对象存在异常

  • undefined、函数:当遇到属性值类型为 undefined 或者 函数,无法进行转化,该属性会被移除

    JSON.stringify({a:undefinedb:()=>{}})		// '{}'
    
  • NaN、Infinity、-Infinity:当遇到三个类型任何一个,都会被转化为 null

    JSON.stringify({a:NaN,b:Infinity, c:-Infinity})	
    // '{"a":null,"b":null,"c":null}'
    

4、当对象循环引用自身解决方案

当一个对象内部的属性指向自身时,会导致序列化的函数执行报错,此时需要使用第二个参数传入一个函数解决:

let obj = {name: "sishen",age: 18
}
obj.obj = obj
// 直接序列化会报错
JSON.stringify(obj)		// Uncaught TypeError: Converting circular structure to JSON
// 需要传入函数
let cache = []
JSON.stringify(obj, function(key, value) {// 返回值如果是对象,则将循环对象执行该函数,并且首次传入对象if (typeof value === 'object' && value != null) {if(cache.includes(value)) return;cache.push(value)   }return value;
});

5、JSON.parse 问题

在解析字符串时,如果传入一个 undefined 或者 函数 会导致报错,因此如果需要做封装需要注意:

// 以下两种调用方式都会导致报错
JSON.parse(undefined)
JSON.parse(()=>{})

编辑 | sishen
来源 | 前端兔
公众号 | 前端兔

关注公众号查看更多前端知识分享~~

http://www.xdnf.cn/news/11355.html

相关文章:

  • 【转】 ID,ClientID和UniqueID
  • 对一个vbs脚本病毒的病毒原理分析
  • Apche Kafka 的生与死 – failover 机制详解
  • 【51单片机】矩阵键盘
  • 创新管理:臭鼬工厂的故事
  • Directsound和Waveout
  • 什么是卷积?
  • 详解DOM对象中clientWidth、offsetWidth等属性
  • 关于AlertDialog 的一些用法
  • 常用正则表达式合集,这一篇就够了!!(含完整案例,建议收藏)
  • PC硬件——主板
  • 永恒之蓝(ms17-010)简介与复现
  • BNF 介绍
  • 国外有哪些安全论坛或者黑客论坛,或者导航类黑客学习网站?
  • 在win10下的VTK安装 VS2017+VTK+ITK+camke+QT的逐步安装(保姆级教程,逐步教程)
  • 贪心算法(greedy algorithm,又称贪婪算法)详解(附例题)
  • FCFS、SJF、HRRN调度算法
  • 面试官:消息队列 MQ/ JMS/ Kafka 有什么区别?
  • 腾讯走上王者之位,你以为靠的只是抄袭?
  • Noteability的一些使用小技巧
  • 前途无忧-学费分期、招生就业服务平台
  • 01 | 冯·诺依曼体系结构:计算机组成的金字塔
  • 最全ADB教程
  • 深入解析OpenCV imread()函数:图像读取的关键步骤
  • 怎么下载jQuery文件
  • BAT机器学习面试1000题系列(第1~305题)
  • getAttribute()用法
  • TPS5430学习记录(一)手册理解
  • SSTI 小结
  • C# 多线程