javaScript对象与jsON字符串转换仅靠json.Stringify()和JSON.parse()不够,需注意数据类型丢失、循环引用报错、特殊值(NaN/Infinity/-0转NULL)等问题。

javascript 对象和 JSON 字符串之间转换,只靠 JSON.stringify() 和 JSON.parse() 就够了,但直接套用常出错——关键在数据类型、循环引用、特殊值处理这三处。
什么时候必须用 JSON.stringify()?
只有当你要把 JS 数据发给后端、存入 localStorage、写入文件或跨环境传输时,才需要转成 JSON 字符串。它不等于“格式化打印”,也不解决对象深拷贝问题。
-
JSON.stringify()会忽略函数、undefined、symbol 类型的键和值 - 遇到循环引用(比如
a.b = a)直接抛错:TypeError: Converting circular structure to JSON - 日期对象会被转成 ISO 字符串(
new date() → "2024-05-12T08:30:00.000Z"),不是毫秒数 - 如果需要定制输出(比如过滤字段、重命名 key),用第二个参数
replacer函数或数组,别手写拼接
为什么 JSON.parse() 常报 “Unexpected Token”?
这不是语法错误,而是输入根本不是合法 JSON:单引号、尾逗号、注释、undefined 值、浏览器控制台里直接复制的对象打印结果,都不是 JSON。
- JSON 要求双引号包裹 key 和字符串值,
{'name': 'Alice'}是错的,{"name": "Alice"}才对 - 确保传入的是字符串类型——
typeof data === "string",别误传对象进去 - 后端返回的数据可能带 bom 或空白字符,用
data.trim()再解析更稳 - 想安全解析又不想崩,包一层 try/catch:
try { const obj = JSON.parse(str); } catch (e) { console.error('Invalid JSON:', e.message); }
JSON.stringify() 和 JSON.parse() 能不能替代深拷贝?
能临时用,但有硬伤:会丢失原型链、正则、Date、map、Set、函数等原生类型,且无法处理循环引用。
立即学习“Java免费学习笔记(深入)”;
- 简单纯数据对象(仅 Object/Array/string/number/Boolean/null)可以:
JSON.parse(JSON.stringify(obj)) - 含
regexp的对象转完变空对象{};new Date()变字符串;undefined键直接消失 - 真正要深拷贝,优先选结构化克隆(
structuredClone(),chrome 98+ 支持),或专用库如 lodash 的cloneDeep
最常被忽略的一点:JSON 规范里没有 NaN、Infinity、-0 这些值,它们在 JSON.stringify() 中会被转成 null,而 JSON.parse() 永远不会生成它们——这意味着你一旦走 JSON 流程,这些信息就不可逆地丢了。