Почему голый Array допустимый синтаксис Javascript, но не голый объект?
В моей консоли Javascript (в Chrome) я пытаюсь это:
{ 'a' : 1 }
и получать SyntaxError: Unexpected token :
Но это работает:
['a', 1]
Что дает???
4 ответа
Это потому, что у фигурных скобок есть два применения - либо введение блока, либо в качестве начала литерала объекта (последний является выражением).
Консоль не может определить, какой именно, поэтому она принимает блок операторов и только позже обнаруживает, что содержимое блока не может быть проанализировано как операторы.
Для литералов массива в квадратных скобках такой неоднозначности не существует.
Неоднозначность может быть решена путем изменения контекста так, чтобы {...}
должен интерпретироваться как выражение, а не как блок операторов, например, путем превращения его в RHS оператора, включения его в скобки или передачи его в качестве параметра функции и т. д.
Это блок:
{
var x = 'stuff'
function doStuff(arg) { alert(arg) }
doStuff(x)
}
Это предупредит stuff
,
Теперь о вашем примере: JavaScript считает, что это блок, например так:
{
'a' : 1
}
поскольку 'a' : 1
не является действительным утверждением, оно не выполняется.
Обратите внимание, что если вы делаете
'x' + { 'a' : 1 }
Это работает, потому что нет никакого способа, которым блок мог прибыть после +
,
Как отмечали другие, это связано с тем, что фигурные скобки имеют двойное назначение.
Самый простой способ обойти эту неоднозначность - добавить пару скобок:
> {'a': 1}
SyntaxError: Unexpected token :
> ({'a': 1})
Object {a: 1}