5

Destructuring_assignment#Assignment_without_declarationВ чем разница между `{}` и `()` в этом коде?

он говорит:

в {а, Ь} на левой стороне считается блок, а не объект буквальным.

var a, b; 
{a, b} = {a:1, b:2};//Syntax Error! 
({a, b} = {a:1, b:2}); // it works 

что '()' делать во втором предложении?

Почему '{}' в нем считается объектным литералом?

+0

Скобки могут содержать только выражения: блоки * заявления *, но объект литералы или переменные присваивания * выражения *. – gcampbell

ответ

2

Заявления не должны начинаться с брекетами в Javascript: Pitfalls of destructuring

В качестве альтернативы, следующее выражение можно:

"",{a, b} = {a:1, b:2}; 

Важно лишь, что заявление не начинается с фигурной скобки, потому что код блоки начинаются с одного.

+0

** Заявления не должны начинаться с фигурных скобок ** - это неправильно. вы можете выполнить, например {} (a = 'test'), и он отлично работает. –

+0

Да. Теперь все в порядке. –

+0

Комментарий Андрея неправильный. '{} ({a, b} = {a: 1, b: 2});' либо интерпретируется как пустой литерал объекта, либо как пустой блок (каждый из которых следует за присваиванием назначения для деструктурирования). Благодаря ASI (Automatic Semicolon Insertion) эта строка преобразуется в: '{}; ({a, b} = {a: 1, b: 2}); '. Вот и все. Поскольку ни объектный литерал, ни пустой блок не являются оператором, код действителен. – ftor

1

Первый пытается присвоить значение блоку, что неверно. Второй эквивалент

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

Так вот вы вызываете конструктор, снабжая блок свойств и присвоения им значений.

1

может я просто привести hilighted объяснение прямо рядом с образцом вы связаны между собой:

Я думаю, что это довольно ясно

The (..) вокруг оператора присваивания требуется синтаксис при использовании назначение объектного деструктурирования без объявления.

{a, b} = {a:1, b:2} недопустим автономный синтаксис, так как {a, b} с левой стороны считается блоком, а не литералом объекта.

Однако ({a, b} = {a:1, b:2}) действует, как var {a, b} = {a:1, b:2}

0

Мы не можем присвоить любые значения любых литералов как массив, объект, строка.

ex: [a] = [1];

{a} = {1};

"a" = "b";

Но мы можем присвоить значение с помощью запятая

[а], {а} = {а: 1};

Выход:

[а] - [1]

{а} - {а: 1}

Примечание:

1.Object буквальным не должен быть первым в инициализации.

2. В строковом литерале никогда не сохраняются никакие значения.

() - это qualto возвращение заявление

Все, что вы дали в {}, он будет автоматически выполнять сам;

Проверить только код {return;} В любом месте функции он вернет функцию.

Просто загляните в код, сжатый для понимания.

var a =5;b=6; 
 
console.log(JSON.stringify({a,b})); 
 
//Output: {"a":5,"b":6} 
 

 
[a,b],{a,b} = {"a":1, "b":2}; 
 
console.log(JSON.stringify([a,b])); 
 
console.log(JSON.stringify({a,b})); 
 
//Output: 
 
//[1,2] 
 
//{"a":1,"b":2} 
 

 
var name = (function(){return "lotus"}); 
 
console.log(name); 
 
//Output: function(){return "lotus"} 
 

 
name = (function(){return "lotus"})(); 
 
console.log(name); 
 
//Output: lotus 
 

 
name = ({a, b} = {a:3, b:4}); 
 
console.log(JSON.stringify(name)); 
 
//Output: {"a":3,"b":4}

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