Почему голый 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}

Ты можешь сделать new Object({'a' : 1}) для этого.

Другие вопросы по тегам