【发布时间】:2012-02-23 07:46:09
【问题描述】:
当我在 Chrome JavaScript 控制台中输入简单对象时,我会得到如下输出:
>true
true
>1/3
0.3333333333333333
等等。
但是当我键入对象时出现语法错误:
>{ a: 1, b: 2 }
SyntaxError: Unexpected token :
arguments: Array[1]
0: ":"
length: 1
__proto__: Array[0]
get message: function getter() { [native code] }
get stack: function getter() { [native code] }
set message: function setter() { [native code] }
set stack: function setter() { [native code] }
type: "unexpected_token"
__proto__: Error
虽然我确信这个表达式可以正确地用于初始化对象,因为:
>obj = { a: 1, b: 2 }
Object
a: 1
b: 2
__proto__: Object
也许这是一个愚蠢的问题,但我真的很想知道为什么会这样?
【问题讨论】:
-
我知道的足以告诉你,这是因为 JavaScript 非常注重什么是有效表达式,什么不是。例如,
function foo(){}是函数声明,而(function foo(){})是函数表达式,由于语法规则,它们具有不同的函数含义。我对规范的了解不足以为您指出不允许{}作为表达式但允许({})的确切措辞(试试看!),但我知道规范的疯狂程度足以告诉您该答案很可能只是让你说“嗯。好吧。”。 -
您可能得到的最佳答案类似于
+[]等于0,但+[]+[]等于字符串"0"的原因。原因是“因为这是规范要求做的”,而没有深入了解为什么规范作者选择做出该决定。 -
有趣的是,只输入
{a:1}会得到1,这也是因为对这种情况的不同解释。一个很好的答案可能还包括为什么会这样。如果按照我们的预期解释这个表达式,一个史诗般的答案会显示可能会发生什么混乱/冲突。 -
除非我在对象后添加索引,否则无法重现此问题,如 stackoverflow.com/questions/48548444/… 自 2012 年以来控制台解析器是否已更改?
-
是的,它已经改变了:stackoverflow.com/a/36438289/864233
标签: javascript json oop google-chrome v8