JSON和JS对象

本文探讨了JSON和JS对象的区别,指出JSON是数据交换格式,其属性名必须加双引号,而JS对象的属性名可加可不加引号。JSON对象并不是一个独立的概念,而是指通过JSON.parse()解析后的JS对象。文章提到了JSON.parse()相对于eval()的安全优势,并引用了相关资源进行深入讨论。

序言   

    之前看代码,看到定义JS对象时,有些地方属性名不加引号,有些却加了,带着疑问搜了一下,结果大概是这样的:

    JS对象的引号是可加可不加的,有个列外就是如果使用不规则属性名时必须加引号,如3rd。大家还提到了另一个概念—JSON,JSON的属性名是必须加双引号的。如果不加双引号,是不能正确解析成“JSON对象”的。提到JSON,从字面上看与JS对象非常相似,它们到底有什么区别呢。

JSON与JSON对象的区别

    JSONJavaScript Object Notation,一种轻量级的数据交换格式,基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。

    下面定义一个JSON和JS对象

// 这是JSON字符串
var foo = '{ "prop": "val" }';
 
// 这是对象字面量
var bar = { "prop": "val" };

          说它们类似,是从字面上的意义理解的,这里引用一位同学给出的答案:

          1. JS是一种脚本语言, 对象是对象字面量(符合对象定义语法的文本)被脚本引擎解释之后,在内存中产生的,定义对象的文本是否符合语法,取决于脚本引擎。 

          2. JSON不是一种语言,它仅仅是一种数据的表达方式,从某种程度上来讲,JSON跟XML没有什么区别。 对于JS的字面量来说,上面文本仅仅是代码的一部分,相当于指令,而JSON文本,它本身就表示了数据

         总结下,两者完全就是不同的概念,是不能相提并论的。

         从语法上看,两者也是有区别,JSON有更严格的语法规则,具体可参考。JS对象属性名是可以加双引号、单引号或不加引号,如        

     var bar = {prop: "var"};
         这在js中是合法的,但是这却不是合法的JSON,因为JSON里的键/值都必须用双引号引住。

JSON对象?

     大家经常会说把JSON字符串转化成JSON对象,把JSON转化成字符串,这里所谓的JSON对象是不对的,这种说法是不对的,JSON是可以通过方法转换成对象,但这也是JS对象,不是什么JSON对象。

     有人可能不同意了,是的,的确有真正意义上的JSON对象,而不是上面提到的那种。JSON对象已经内置为全局对象了(IE8及以上都支持),目前有2个静态方法,JSON.parse:用来将JSON字符串解析成对象;JSON.stringify:用来将对象序列化成JSON字符串。(注意:老版本的浏览器并不支持这个对象,我们可以通过json2.js来实现同样的功能。)

     提到将JSON字符串解析成对象,就不得不提一下,eval(),这个也可以用来解析JSON,但是大家都不常用它来解析,主要是因为用eval()解析会存在安全隐患,因为它能解析任何的JS表达式,而JSON.parse只能解析JSON,有人说JSON.parse()方法其实就是通过eval()来实现的,只不过有对字符串进行控制,只对严格符合JSON语法的字符串进行解析,还包括一些其他的安全控制。


Reference:

  [1] 深入理解JavaScript系列(9):根本没有“JSON对象”这回事!

  [2] json对象和js对象的区别

  [3] JSON.parse vs. eval()



        

    

### 三级标题:JSON JavaScript 对象的区别 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其语法来源于 JavaScript 的对象字面量表示法,但被设计为独立于编程语言的通用数据格式。JavaScript 对象则是 JavaScript 语言内部用于表示复杂数据结构的基本方式。两者在语法上高度相似,但在用途、特性使用场景上有明显区别。 #### 语法与表示方式 JSON 的语法是 JavaScript 对象字面量的子集,但它只能使用特定格式的键值对,其中键必须是字符串,值可以是字符串、数字、布尔值、数组、嵌套对象或 `null`[^3]。例如: ```json { "name": "Alice", "age": 25, "roles": ["admin", "user"], "address": { "city": "Beijing", "zip": 100000 } } ``` JavaScript 对象的表示方式更为灵活,支持函数、Symbol 类型、undefined 值等非 JSON 数据类型: ```javascript const user = { name: 'Alice', age: 25, roles: ['admin', 'user'], address: { city: 'Beijing', zip: 100000 }, greet: function() { console.log(`Hello, ${this.name}`); } }; ``` #### 数据用途与操作 JSON 主要用于数据的序列化传输,适用于跨语言的数据交换。它不支持函数、变量、注释等语言特性,因此更适合在不同系统之间传递结构化数据[^5]。JavaScript 对象则是运行在 JavaScript 引擎中的实际数据结构,支持方法、原型链、访问器属性等语言特性,适合在程序内部进行复杂的数据操作逻辑处理。 JavaScript 提供了内置方法用于在对象 JSON 字符串之间进行转换。例如,`JSON.stringify()` 可将 JavaScript 对象转换为 JSON 字符串,而 `JSON.parse()` 可将 JSON 字符串解析为 JavaScript 对象[^2]。 ```javascript const obj = { name: "Alice", age: 25 }; const jsonStr = JSON.stringify(obj); // {"name":"Alice","age":25} const parsedObj = JSON.parse(jsonStr); // { name: 'Alice', age: 25 } ``` #### 内存结构与使用场景 JSON 对象在编程语言中通常以类或结构的形式存在,例如 Java 中的 `JSONObject` 或 Python 中的 `dict`,它们用于在程序中构建、解析操作 JSON 数据[^4]。JavaScript 对象则是语言本身的运行时结构,具备完整的语言特性支持,如作用域、闭包、继承等。 JSON 常用于 API 响应、配置文件、日志数据等需要跨平台共享的场景;JavaScript 对象则用于前端或后端应用中进行动态数据处理逻辑执行。 #### 总结 虽然 JSON JavaScript 对象在语法上非常相似,但它们在本质上是不同的数据表示形式。JSON 是一种通用的数据交换格式,强调结构的标准化跨语言兼容性;而 JavaScript 对象是语言内部的数据结构,强调功能的完整性灵活性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值