JavaScript处理以下两个声明的方式有区别吗?
var foo = {
foo : true,
bar : 1
};
var foo2 = {
"foo" : true,
"bar" : 1
};
JavaScript似乎对待它们是一样的。如果它们真的相同那么,是否有“正确”或首选方式来声明这一点?
答案 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
}
所以你的第二个代码(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