为什么裸阵列有效的Javascript语法,但不是裸对象?

时间:2013-06-29 15:59:17

标签: javascript syntax

在我的Javascript控制台(在Chrome中)我正在尝试这个:

 { 'a' : 1 }

并获得SyntaxError: Unexpected token :

但这有效:

 ['a', 1]

是什么给了???

4 个答案:

答案 0 :(得分:6)

这是因为花括号有两个用途 - 要么引入一个块,要么作为对象文字的开头(后者是表达式)。

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

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

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

答案 1 :(得分:3)

这是阻止

{
    var x = 'stuff'
    function doStuff(arg) { alert(arg) }
    doStuff(x)
}

它会提醒stuff

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

{
    'a' : 1
}

由于'a' : 1 是有效声明,因此失败。

请注意,如果你这样做

'x' + { 'a' : 1 }

它有效,因为在+之后无法阻挡块。

答案 2 :(得分:2)

你可以为此new Object({'a' : 1})做。

答案 3 :(得分:2)

正如其他人所指出的那样,这是因为花括号具有双重用途。

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

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

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