在 Javascript 控制台中输入 {a:1} 给出 1 和 {a:1, b:2} 给出错误的行为是什么?

IT技术 javascript firebug javascript-objects
2021-03-12 21:30:02

以下将显示在 Firebug 或jsconsole.com或其他 Javascript 交互式控制台中:

>>> foo = { a : 1, b : 2.2 }
Object { a=1, more...}

>>> foo.a
1

>>> foo.b
2.2

>>> { a : 1, b : 2.2 }
SyntaxError: invalid label { message="invalid label", more...}

>>> { a : 1 }
1

为什么1返回{a : 1}以及为什么{a : 1, b : 2.2}给出错误?在 Ruby 中,它们会以您定义的方式返回。

3个回答

第二行给你 aSyntaxError因为{它开头标记会导致歧义,解析器将它视为Block statement,而不是对象文字的开头。

例如,一个有效的 Block 语句:

{ foo: 'bar' }

上面看起来像一个对象字面量,但它不是,因为代码是在语句 context 中计算的

它将被解析为一个块,其中包含一个带标签的语句( foo),后跟一个表达式语句 ( 'bar')。

为确保您使用的是对象字面量的语法,您可以用括号(也称为分组运算符将其包裹起来

({ foo: 'bar' })

分组运算符只能取表达式,因此没有歧义。

也可以看看:

(“带标签的语句”是 JavaScript 从 C 继承而来的东西,可用于gotos。带标签的语句在 JavaScript 中几乎从未使用过,这就是为什么它会令人惊讶{foo: 'bar'}地被视为有效的语句。)
2021-05-11 21:30:02
+1 我今天学到了一些新东西。我从来没有将对象字面量语法放入 REPL 而不将其分配给 var,但是知道这很有趣..
2021-05-15 21:30:02

我不是 100% 肯定,但我认为正在发生的是在第二行中您定义的是一个块,而不是一个对象。因此,当解析器到达逗号时就会出现解析错误,因为它需要半色。定义的标签是标签,就像在 goto 或 switch 语句中一样。我希望这个解释有意义。

控制台做为 eval('你输入')

eval({....}) --- this will get an error
eval('({....})')---eval string as a function
是你想显示之间的区别eval("{}"),并eval("({})")一不小心忘了引号?如果您解决此问题,则每个案例的描述都是不正确的。如果不是,则此答案与问题无关。答案也没有解释为什么一种语法与另一种语法不正确,以及eval与其中任何一种的关系。
2021-04-28 21:30:02