2015-01-09 2 views
2

Почему это не действует при использовании нового ES6 деструктурирующего синтаксисаобъекта Javascript уничтожения того

var a, b, c; 
{a, b, c } = {a:1, b:2, c:3}; 

когда это:

var {a, b, c } = {a:1, b:2, c:3}; 
console.log(a, ' ', b, ' ',c); 

и так это:

var a = 1; 
var b = 3; 

[a, b] = [b, a]; 

Я имел читать the MDN documentataion, и я не вижу упоминания о синтаксисе, который я пытаюсь, и полагаю, что должна быть веская причина, я «Просто пытаюсь понять, почему.

+0

Для меня документация MDN подразумевает, что вы * можете * делать то, что вы пытались. – JMM

ответ

4

В вашем примере первый { неоднозначен, и синтаксический анализатор интерпретирует его как начало блока. В то время как {a, b, c} является допустимым блоком, следующий оператор присваивания недопустим.

Wrap все в круглых скобках, и он будет разбирать правильно:

({a, b, c} = {a:1, b:2, c:3}); 

Example


Это похоже на то, литерал объекта, само по себе (по каким-либо причинам):

{"a": 42} // parse error 
({"a": 42}) // works 
+0

С помощью traceur я получаю 'Invalid left-side side in assign' при выполнении этого. '({a, b, c} = {a: 1, b: 2, c: 3});' работает для меня. – JMM

+0

@JMM: Да, у меня было это раньше, но esprima правильно разбирает мое дело. На самом деле я не знаю, что правильно. Я предполагаю, что обертывание всего в скобках безопаснее (обновляется). –

+1

Хорошо, я думал, что так и было, тогда я снова посмотрел, и все было по-другому, но не было редактирования. Я думаю, это происходит, когда редактирование происходит до определенного таймаута. Стоит отметить, что связанная с MDN статья @Raoul подразумевает, что вы можете делать то, что он пытался сделать. – JMM

Смежные вопросы