我正在使用Chrome控制台中的JSON对象,我遇到了这种不寻常的行为:
> {a:1}
1
> {"a":1}
SyntaxError: Unexpected token :
> b={a:1}
Object
> b={"a":1}
Object
为什么第一个语句返回1而不是一个对象,为什么第二个语句有效?我希望前两个语句返回与最后两个语句相同的输出。
答案 0 :(得分:1)
我最好的猜测是在第一个场景中
> {a:1}
大括号被忽略,a
被解释为label。
只需输入
即可获得相同的值1
> a:1
如果这是正确的,第二个例子不起作用,因为双引号在标签中不是可接受的字符。
第三和第四个例子有效,因为它们是有效的变量赋值,并且控制台将对象理解为对象。
答案 1 :(得分:1)
JavaScript表达式语句不能以{
开头,因为它会导致解释器出现歧义,这也可能将其视为语句块。
所以这被认为是一个带有语句标签和数字文字而不是对象文字的语句块:
{a:1}
但是这被认为是语法无效的语句块,因为没有可以以"a":
开头的语句
{"a":1}
但这些不是以{
开头的。它们以b =
开头,因此{
被视为开始对象文字。
b = {a:1}
b = {"a":1}
<强> 12.4 Expression Statement 强>
注意 ExpressionStatement 不能以大括号开头,因为这可能会使其与块不明确。此外, ExpressionStatement 不能以
function
关键字开头,因为这可能会使 FunctionDeclaration 模糊不清。
这意味着您需要做的就是使用不同的字符启动表达式语句以使其有效。
例如,您可以将其包装在括号中,它将起作用:
({"a": 1})
答案 2 :(得分:1)
Chrome评估控制台输入,如下所示:
with ((window && window.console && window.console._commandLineAPI) || {}) {
<your code here>
};
这导致{
}
括号被视为额外的块范围括号,因此被忽略
然后引导我们
a:1
// 1
看作标签
并且
a={a:1}
作为正确的作业
编辑:
这也是JSLint在JSBin
上所说的内容