JS中的对象文字符号差异

时间:2013-10-10 13:46:15

标签: javascript coding-style

JavaScript处理以下两个声明的方式有区别吗?

var foo = {
    foo : true,
    bar : 1
};

var foo2 = {
    "foo" : true,
    "bar" : 1
};

JavaScript似乎对待它们是一样的。如果它们真的相同那么,是否有“正确”或首选方式来声明这一点?

2 个答案:

答案 0 :(得分:3)

任何一种形式都可以用于“初始化”一个对象(也就是声明一个对象文字)。

属性标识符可以是names, numbers, or strings,但它们都被解释为字符串:

var foo = {
  foo  : true,
  "bar": true,
  3    : true
};

See the ECMA-262 5th Edition Language Specification § 11.1.5了解详情。

请注意, PropertyName 构造可能在第5版中已更改(正如许多事情所做的那样),因此不支持最新版JavaScript的浏览器可能会实现不同版本的ECMAScript。

另请注意,JSON defines objects as sets of string/value pairs和字符串用引号括起来:

var fooJSON = '{"foo":true,"bar":true,"3":true}';

答案 1 :(得分:2)

你的第一个样本是不是 json

{
    foo: true,
    bar: 1
}

enter image description here

所以你的第二个代码(jsonlint)是json。

 {
    "foo": true,
    "bar": 1
}

关于你的实际问题,它们都是一样的。

关于评论:

  

如果它们是相同的,但如果第一个例子不是json,而是   第二个是json,有什么区别?

假设我有这个字符串应该(但不是)代表json字符串表示:

此字符串来自服务器:

" {foo: true,bar: 1}"

现在我想解析它。

运行

JSON.parse(" {foo: true,bar: 1}")

会失败:

SyntaxError:意外的标记f

但是:

JSON.parse("{\"foo\": true,\"bar\": 1}")

会做得很好

Object {foo: true, bar: 1}

所以这是一个区别(一个不同的例子)。

说到JS如何看待/处理两个对象(Objects !!!,我没有说json因为第一个不是json) - 它们是相同的。

PS,另一个有用的功能是,即使你没有使用"myProp",道具也会被视为字符串:

示例:

var a={myProp:1};  //notice no `"`
var b="myProp"; 
 a[b]=2; 
alert(a.myProp) //2