5

Destructuring_assignment#Assignment_without_declarationJaka jest różnica między `{}` a `()` w tym kodzie?

mówi:

{A, B} po lewej stronie jest uważany za blok, a nie celem dosłownym.

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

co '()' zrobić w drugim zdaniu?

dlaczego "{}" w nim jest uważane za literalne?

+0

Nawiasy mogą zawierać tylko wyrażeń: Bloki są * Oświadczenia *, ale literały obiektu lub przypisania zmiennych są wyrażenia * *. – gcampbell

Odpowiedz

2

Oświadczenia nie musi zaczynać z szelkami w JavaScript: Pitfalls of destructuring

Alternatywnie, następujące wyrażenie jest możliwe:

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

Ważne jest tylko to, że oświadczenie nie zaczyna się klamra, ponieważ kod bloki zaczynają się od jednego.

+0

** Oświadczenia nie mogą zaczynać się od nawiasów klamrowych ** - to nie w porządku. możesz wykonać, na przykład {} (a = "test") i działa idealnie. –

+0

Tak. Teraz jest ok. –

+0

Komentarz Andrija jest błędny. '{} ({a, b} = {a: 1, b: 2});' jest interpretowane jako pusty obiekt literalny lub jako pusty blok (po którym następuje wyrażenie przypisania destrukturyzacji). Z powodu ASI (Automatic Semicolon Insertion) linia ta jest konwertowana na: '{}; ({a, b} = {a: 1, b: 2}); '. to jest to! Ponieważ ani literał obiektu, ani sam pusty blok nie jest instrukcją, kod jest ważny. – ftor

1

Pierwsza próbuje przypisać wartość do bloku, który nie jest właściwy. Drugi jest odpowiednikiem

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

Więc tutaj jesteś wywołanie konstruktora, dostarczając blok właściwości i przypisanie im wartości.

1

może ja po prostu przytoczyć hilighted wyjaśnienie tuż obok próbki już powiązać

myślę, że to całkiem jasne

The (..) wokół instrukcji przypisania składnia jest wymagane w przypadku korzystania obiektowe przypisanie destruktywne bez deklaracji.

{a, b} = {a:1, b:2} nie jest poprawną składnią autonomiczną, ponieważ {a, b} po lewej stronie jest uważany za blok, a nie za literał obiektowy.

Jednak ({a, b} = {a:1, b:2}) jest ważna, ponieważ jest var {a, b} = {a:1, b:2}

0

Nie można przypisać żadnych wartości do jakichkolwiek literałów jak tablicy, obiekt, string.

ex: [a] = [1];

{a} = {1};

"a" = "b";

Ale można przypisać wartość za pomocą separatora na PRZECINEK

[A], {a} = {O: 1};

wyjściowa:

[a] - [1]

{A} - {A: 1}

Uwaga:

1.Object dosłownym nie powinno być pierwszym w inicjalizacji.

2.W literałach łańcuchowych nigdy nie przechowuj żadnej wartości.

() - jest qualto zamian oświadczenie

Cokolwiek podano w {}, zostanie ona automatycznie wykona się;

Aby sprawdzić, po prostu umieść kod {return;} w dowolnym miejscu funkcji, która zwróci tę funkcję.

Wystarczy spojrzeć na kod snipped dla zrozumienia.

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}

Powiązane problemy