JSON和JS对象

来源:互联网 发布:疯狂的美工助手要钱吗 编辑:程序博客网 时间:2024/03/29 21:59

序言   

    之前看代码,看到定义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()



        

    

0 0
原创粉丝点击