很多刚接触前端的同学会问:{"name": "Tom"} 这不就是 JavaScript 对象吗?两者长得几乎一样,但本质上完全不是一回事。JSON 是一种数据格式(一段字符串),JavaScript 对象是内存中的数据结构。下面讲清它们的 5 个关键区别。
所以 JSON 需要被解析(JSON.parse)才能变成 JS 对象;JS 对象需要被序列化(JSON.stringify)才能变成 JSON 字符串。
JSON 的键必须用双引号包裹,而 JavaScript 对象的键可以省略引号(只要符合标识符规则):
{ "name": "Tom" } // ✅ 合法 JSON
{ name: "Tom" } // ❌ 非法 JSON(但作为 JS 对象合法)
JSON 只支持 6 种类型:字符串、数字、布尔值、null、对象、数组。而 JavaScript 对象的值可以是任意类型,包括:
{ fn: function() {} } —— JSON 不支持undefined、NaN、Infinity —— JSON 不支持Date 对象、正则 —— JSON 不支持(会被转成字符串或 {})JSON 比 JavaScript 严格得多,下面这些都是「JS 里合法、JSON 里非法」的写法:
| 写法 | JavaScript | JSON |
|---|---|---|
| 单引号字符串 | ✅ | ❌ 必须双引号 |
尾逗号 {"a":1,} |
✅ | ❌ |
注释 // 或 /* */ |
✅ | ❌ |
| 键不加引号 | ✅ | ❌ |
JSON 是跨语言的标准格式,Python 的 json.loads、Java 的 Jackson、Go 的 encoding/json 都能解析它。而 JavaScript 对象只能在 JavaScript 里使用。这也是为什么 API 接口都用 JSON 而不是 JS 对象来传输数据。
实际开发中,判断一段代码是 JSON 还是 JS 对象,看两点就够了:
.json 文件里、或是接口返回的字符串 → 是 JSON,键必须加双引号。.js 文件里、直接作为变量使用 → 是 JS 对象,语法更宽松。如果拿到一段 JSON 不确定是否合法,可以用 JSON 在线校验工具 一键检查——它会自动指出错误所在的行和列。