为什么裸数组是有效的Javascript语法,而不是裸对象?

为什么裸数组是有效的Javascript语法,而不是裸对象?,javascript,syntax,Javascript,Syntax,在我的Javascript控制台(在Chrome中)中,我尝试以下操作: { 'a' : 1 } 和获取语法错误:意外标记: 但这是可行的: ['a', 1] 这是一个块: { var x = 'stuff' function doStuff(arg) { alert(arg) } doStuff(x) } 它会提醒东西 现在,关于您的示例:JavaScript认为它是一个块,如下所示: { 'a' : 1 } 由于'a':1不是有效语句,因此它失败

在我的Javascript控制台(在Chrome中)中,我尝试以下操作:

 { 'a' : 1 }
和获取语法错误:意外标记:

但这是可行的:

 ['a', 1]

这是一个

{
    var x = 'stuff'
    function doStuff(arg) { alert(arg) }
    doStuff(x)
}
它会提醒
东西

现在,关于您的示例:JavaScript认为它是一个块,如下所示:

{
    'a' : 1
}
由于
'a':1
不是有效语句,因此它失败

请注意,如果您这样做

'x' + { 'a' : 1 }

它是有效的,因为块不可能在
+

之后出现。这是因为大括号有两种用途——要么引入块,要么作为对象文本(后者是表达式)的开始

控制台无法分辨哪个,因此它假设有一个语句块,直到后来才发现该块的内容不能被解析为语句

对于带方括号的数组文字,不存在歧义


可以通过更改上下文来解决歧义,因此必须将
{…}
解释为表达式而不是语句块,例如,将其设为运算符的RHS,将其括在括号中,或将其作为函数参数传递,等等。

为此,您可以执行
新对象({a':1})

正如其他人所指出的,这是因为大括号有双重用途

解决歧义的最简单方法是添加一对括号:

> {'a': 1}
SyntaxError: Unexpected token :

> ({'a': 1})
Object {a: 1}

谢谢大家的解释。。。虽然我仍然认为这是JavaScript中的一个缺陷。一个块可以出现在一个有效的JS程序的文本中的位置与一个对象文本可以出现的位置完全不同,解析器应该能够很容易地分辨出它们之间的区别。如果你能这样做,我不会说这是错误的。当然,还有其他方法。这也不是一个“好”的方法。最佳实践表明,直接调用基本构造函数(例如Object或Number)是个坏主意