2017-01-09 44 views
17

Chciałbym zadeklarować dwie zmienne z zakresem bloku i zainicjować je do tej samej wartości. Byłoby miło, gdyby pracował następuje w ten sposób, ale to nie ...Czy istnieje sposób wykonywania wielu przydziałów i inicjalizacji za pomocą zakresu bloków?

{ 
    let a = b = "wang"; 
} 
console.log("b:", b); 

zmiennej „a” ma blokować zakres, ale zmienną „B” nie, to ma zakres funkcji, jak gdyby zostały zgłoszone z var.

Czy istnieje jedna linia * sposobem osiągnięcia tego czy mam robić ...

let a, b; 
a = b = "wang"; 

* nie, że będę rzucać czytelność pod autobus, aby zaoszczędzić parę znaków ty rozumiem, jestem po prostu ciekawy!

+0

To nie tak jak 'var'. Staje się niejawnym globalnym. Nie rób tego! – Oriol

+0

@oriol jest dokładnie taki jak 'var', więc staje się niejawnym globalnym. Zrób to jak James Thorpe do – edc65

+0

@ edc65 Nie, to nie jest tak jak "var". Deklaracje 'var' nie rzucają w trybie ścisłym. Implicit globals zrobić. – Oriol

Odpowiedz

23

Można to zrobić w jednej deklaracji let następująco:

{ 
    let a = "wang", b = a; 
} 
console.log("b:", b); //undefined or ReferenceError 

Ponieważ zarówno a i b są zadeklarowane z let wewnątrz szelki, oboje się zablokować zakres. Najpierw musisz przypisać a, aby został przypisany przed przypisaniem go również do b.

+0

Uważam, że jest to najlepszy i optymalny sposób. – murli2308

+0

Dzięki. Najlepiej użyć tego tylko z krótkimi wyrażeń dla zachowania czytelności. – technicalbloke

2

można spróbować z

{ let [a, b] = [3, 3]; console.log(a); console.log(b)} 
2

Przypisanie dzieje się od prawej do lewej. Więc niech oświadczenie ma zastosowanie tylko do a i nie b
Wszystkie pozostałe zmienne są uważane za świat bez var/niech oświadczenie, stąd b będzie globalny

11

Można użyć tablicę destructuring z fill aby uniknąć powtarzania wartości :

{ 
 
    let [a, b, c, d] = Array(4).fill("wang"); 
 
    console.log(a, b, c, d); // "wang", "wang", "wang", "wang" 
 
} 
 
a; // ReferenceError

Jeśli nie chcesz się martwić o liczbie zmiennych i nie chcą przeznaczyć BI g tablice, możesz również użyć natychmiast wywoływanego wyrażenia funkcji generatora. Dla uproszczenia, może to być dobry pomysł, aby zaimplementować to jako funkcję pomocnika

const repeat = function*(value){while(true) yield value}; 
 
{ 
 
    let [a, b, c, d] = repeat("wang"); 
 
    console.log(a, b, c, d); // "wang", "wang", "wang", "wang" 
 
} 
 
a; // ReferenceError

+0

Dzięki, to sprytne podejście. W związku z tym prawdopodobnie nie będę go używał w gniewie, ale zawsze dobrze jest wiedzieć;) – technicalbloke

+1

'funkcja repeat (x) {while (true) yield x; } 'powinno zostać wyodrębnione do funkcji pomocnika. Użycie parametru ma tę zaletę, że w 'let [a, b, c] = repeat ({...})' wszystkie zmienne dzielą wartość odniesienia, zamiast kopii generowanych w każdej iteracji. – Bergi

+0

@Bergi Tak, myślałem, że byłoby problematyczne, gdyby wartość była obiektem lub symbolem. Używanie funkcji pomocnika to dobry pomysł, dziękuję. – Oriol