解锁 JSON.stringify() 7 个鲜为人知的坑

首先说一下为什么写这篇文章,第一个是确实JSON.stringify()是有很多坑的。 还有再一个前两天写了一篇关于JSON.stringify()文章:

# 解锁 JSON.stringify() 5 个鲜为人知的功能

挺受欢迎的于是想再写一篇

在本文中,我们将探讨与JSON.stringify()相关的各种坑。

1. 处理undefined、Function和Symbol值

在前端中 undefinedFunctionSymbol值不是有效的JSON值。在转换过程中遇到它们时,它们会被省略(在对象中),或者被更改为null(在数组中)。

例如:

js 复制代码
const obj = { foo: function() {}, bar: undefined, baz: Symbol('example') };  
const jsonString = JSON.stringify(obj);  
console.log(jsonString); // 输出: '{}'  
  
const obj2 = {arr: [function(){}]};  
console.log(JSON.stringify(obj2)); // 输出: {"arr":[null]}

2. 布尔、数字和字符串对象

布尔、数字和字符串对象在字符串化过程中会被转换为它们对应的原始值。

js 复制代码
const boolObj = new Boolean(true);  
const jsonString = JSON.stringify(boolObj);  
console.log(jsonString); // 输出: 'true'

3. 忽略Symbol键的属性

Symbol键属性在字符串化过程中完全被忽略,即使使用替换函数也是如此。这意味着与Symbol键关联的任何数据都将在生成的JSON字符串中被排除。

js 复制代码
const obj = { [Symbol('example')]: 'value' };  
const jsonString = JSON.stringify(obj);  
console.log(jsonString); // 输出: '{}'  
  
const obj2 = {[Symbol('example')]: [function(){}]};  
console.log(JSON.stringify(obj2)); // 输出 '{}'

4. 处理无穷大(Infinity)、NaN和Null值

Infinity、NaN 和 null 值在字符串化过程中都被视为 null。

js 复制代码
const obj = { value: Infinity, error: NaN, nothing: null };  
const jsonString = JSON.stringify(obj);  
console.log(jsonString); // 输出: '{"value":null,"error":null,"nothing":null}'

5. Date对象被视为字符串

Date实例通过实现toJSON()函数来返回一个字符串(与date.toISOString()相同),因此在字符串化过程中被视为字符串。

js 复制代码
const dateObj = new Date();
const jsonString = JSON.stringify(dateObj);
console.log(jsonString); // 输出:"2024-01-31T09:42:00.179Z"

6. 循环引用异常

如果 JSON.stringify() 遇到具有循环引用的对象,它会抛出一个错误。循环引用发生在一个对象在循环中引用自身的情况下。

js 复制代码
const circularObj = { self: null };
circularObj.self = circularObj;
JSON.stringify(circularObj); // Uncaught TypeError: Converting circular structure to JSON

7. BigInt转换错误

使用JSON.stringify()转换BigInt类型的值时引发错误。

js 复制代码
const bigIntValue = BigInt(42);  
JSON.stringify(bigIntValue); // Uncaught TypeError: Do not know how to serialize a BigInt

各位同学如果在开发中还遇到过不一样的坑,还请评论区补充互相讨论

点赞收藏支持、手留余香、与有荣焉,动动你发财的小手哟,感谢各位大佬能留下您的足迹。

往期热门精彩推荐

解锁 JSON.stringify() 5 个鲜为人知的功能

如何去实现浏览器多窗口互动

面试相关热门推荐

前端万字面经------基础篇

前端万字面积------进阶篇

简述 pt、rpx、px、em、rem、%、vh、vw的区别

实战开发相关推荐

前端常用的几种加密方法

探索Web Worker在Web开发中的应用

不懂 seo 优化?一篇文章帮你了解如何去做 seo 优化

【实战篇】微信小程序开发指南和优化实践

前端性能优化实战

聊聊让人头疼的正则表达式

获取文件blob流地址实现下载功能

Vue 虚拟 DOM 搞不懂?这篇文章帮你彻底搞定虚拟 DOM

移动端相关推荐

移动端横竖屏适配与刘海适配

移动端常见问题汇总

聊一聊移动端适配

Git 相关推荐

通俗易懂的 Git 入门

git 实现自动推送

更多精彩详见:个人主页

相关推荐
weelinking2 分钟前
【claude】14_Claude作为技术文档助手
前端·人工智能·react.js·数据挖掘·前端框架
天问一4 分钟前
router路由类型和使用方法
开发语言·javascript·ecmascript
jiayong237 分钟前
前端面试题库 - JavaScript核心基础篇
前端·javascript·面试
JAVA面经实录9179 分钟前
Java多线程并发高频面试100题(完整版·含答案·背诵版)
java·开发语言·面试
软件技术NINI21 分钟前
泉州html+css 4页
前端·javascript·css·html
再吃一根胡萝卜22 分钟前
OpenScreen:免费开源的录屏神器,做出专业级演示视频
前端
Cloud_Shy61824 分钟前
Python 数据分析基础入门:《Excel Python:飞速搞定数据分析与处理》学习笔记系列(第十一章 Python 包跟踪器 下篇)
前端·后端·python·数据分析·excel
kyriewen25 分钟前
我用AI把公司10万行代码屎山重构了,CTO看了代码后说:你提前转正
前端·javascript·ai编程
ttwuai28 分钟前
XYGo Admin 菜单与路由:Vue3 动态路由 + GoFrame 权限菜单的完整实现方案
前端·vue·后台框架