为什么裸数组是有效的Javascript语法,而不是裸对象?
在我的Javascript控制台(在Chrome中)中,我尝试以下操作:为什么裸数组是有效的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不是有效语句,因此它失败
{ '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)是个坏主意