JS对象是内存数据结构,JSON是字符串;用typeof可快速区分:对象返回"object",JSON字符串返回"string";需配合JSON.parse()和JSON.stringify()验证合法性与可序列化性。

JavaScript 对象是运行时内存中的数据结构,JSON 是字符串——两者根本不是同一类东西,不能混用,也不能直接比较“相等”。
怎么一眼分辨 obj 是 JS 对象还是 JSON 字符串?
看 typeof 最快:
-
typeof {name: "Alice"}→"object"(注意:null也是"object",需额外判断) -
typeof '{"name":"Alice"}'→"string"
再加一层保险:用 JSON.parse() 尝试解析,失败就不是合法 JSON;用 JSON.stringify() 能成功转出字符串,说明它是可序列化的 JS 对象(不含函数、undefined、Symbol、循环引用等)。
常见误判场景:fetch 响应体默认是 Response.body 流,必须调用 .json() 方法才能得到 JS 对象——它返回的是 Promise,不是立刻拿到对象。直接 console.log(res.json()) 看到的是 Promise {,不是 JSON 字符串也不是对象。
立即学习“Java免费学习笔记(深入)”;
JSON.parse() 和 JSON.stringify() 的坑在哪?
这两个函数看似简单,但实际踩坑率极高:
-
JSON.parse('{"name": "Tom", "age": }')→ 报错SyntaxError: Unexpected token }:JSON 不允许末尾逗号、单引号、注释、undefined 或函数 -
JSON.stringify({x: undefined, y: function(){}})→"{}":undefined和函数会被静默丢弃,不报错也不警告 -
JSON.stringify({a: 1, b: {c: 2}})→ 正常;但若b引用了a(循环引用),会直接抛TypeError: Converting circular structure to JSON - 时间对象:
JSON.stringify(new Date())→"2026-01-21T10:17:00.000Z"(自动转 ISO 字符串),但JSON.parse()不会把它变回Date实例,仍是字符串
建议:永远用 JSON.stringify(obj, null, 2) 带缩进调试,避免手动拼接 JSON 字符串;生产环境传参前,先用 try...catch 包裹 JSON.parse,别让解析失败导致整个流程崩溃。
操作对象属性时,为什么 obj.name 有时是 undefined 却不报错?
因为 JS 对象属性访问是“软失败”机制——读取不存在的属性返回 undefined,不会 throw。但这恰恰掩盖了真实问题:
- 拼写错误:
obj.userName写成obj.username(大小写敏感) - 异步未完成:
user对象还没从 API 返回,就执行user.profile.avatar - 嵌套空值:
user?.profile?.avatar比user.profile.avatar安全得多(ES2020 可选链) - 检查存在性:
"profile" in user或user.hasOwnProperty("profile")比user.profile !== undefined更准确(后者对user.profile = null也成立)
别依赖 == 判空:obj.prop == null 会同时匹配 null 和 undefined,但语义模糊;优先用严格相等 === 或可选链 + 空值合并操作符:obj?.prop ?? "default"。
什么时候该用对象,什么时候该用 JSON?
一句话判断:你在代码里“操作数据”就用 JS 对象;你在“发请求”“存 localStorage”“写配置文件”就用 JSON 字符串。
- ✅ 正确:
localStorage.setItem("user", JSON.stringify(userObj));取回后JSON.parse(localStorage.getItem("user")) - ✅ 正确:
fetch("/api/user", { method: "POST", body: JSON.stringify(data) }) - ❌ 错误:
JSON.stringify({ greet() { alert("hi") } })→ 函数被丢弃,且无提示 - ❌ 错误:
const config = JSON.parse('{ "timeout": 5000 }'); config.timeout += "ms";→ 后续所有使用都基于错误类型,难追溯
真正容易被忽略的是:JSON 不是“更安全的对象”,它只是“不可执行的纯数据”。JS 对象能做的事(响应式更新、方法调用、原型继承),JSON 字符串一个都做不到——别试图把它当对象使。











