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