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、函数等原生类型,且无法处理循环引用。
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。它不是新的编程语言,而是一种使用现有标准的新方法,最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容,不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。《php中级教程之ajax技术》带你快速
立即学习“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 流程,这些信息就不可逆地丢了。










