Javascript Jak zdefiniować wiele zmiennych w jednym wierszu?


103

Czytając dokumentację online, nie rozumiem, jak poprawnie zdefiniować wiele zmiennych JavaScript w jednym wierszu.

Jeśli chcę skondensować poniższy kod, jaki jest właściwy „ścisły” sposób w JavaScript na definiowanie wielu zmiennych javascript w jednym wierszu?

var a = 0;
var b = 0;

Czy to:

var a = b = 0;

lub

var a = var b = 0; 

itp...


1
Więcej o przypisywaniu wielokrotnym: Jak działa przypisywanie zmiennych w JavaScript? . Uważam, że ten wzorzec jest przydatny wewnątrz zamknięcia, aby ujawnić funkcje konstruktora:var $cls = my.namespace.Foo = function(args){ ... }
blong

Zastanawiam się, dlaczego chcesz to skondensować w pierwszej kolejności. IMHO deklarowanie i przypisywanie jednego zmiennej po drugiej jest znacznie jaśniejsze i łatwiejsze do zrozumienia dla każdego.
Henning

Odpowiedzi:


76

Chcesz polegać na przecinkach, ponieważ jeśli polegasz na konstrukcji wielokrotnego przypisania, strzelisz sobie w stopę w takim czy innym miejscu.

Przykładem może być:

>>> var a = b = c = [];
>>> c.push(1)
[1]
>>> a
[1]

Wszystkie odnoszą się do tego samego obiektu w pamięci, nie są „unikalne”, ponieważ za każdym razem, gdy tworzysz odniesienie do obiektu (tablica, literał obiektu, funkcja), jest ono przekazywane przez odniesienie, a nie wartość. Więc jeśli zmienisz tylko jedną z tych zmiennych i chcesz, aby działały indywidualnie, nie otrzymasz tego, czego chcesz, ponieważ nie są to pojedyncze obiekty.

Przypisywanie wielokrotne ma również wadę polegającą na tym, że zmienne drugorzędne stają się zmiennymi globalnymi i nie chcesz przeciekać do globalnej przestrzeni nazw.

(function() {  var a = global = 5 })();
alert(window.global) // 5

Najlepiej jest po prostu używać przecinków i najlepiej z dużą ilością spacji, aby było czytelne:

var a = 5
  , b = 2
  , c = 3
  , d = {}
  , e = [];

2
To naprawdę problem z przypisywaniem odwołań do tablic w ogóle, a nie tylko z instrukcjami przypisania jako wartościami.
Matthew Flaschen

„Więc chociaż możesz uciec z wieloma zadaniami do prawej ręki, takimi jak literały numeryczne”
meder omuraliev

1
@meder, to problem z każdym przydziałem. Nie ma nic specjalnego w prawej ręce.
Matthew Flaschen

Miałem na myśli ogólnie zadania. Zredagowane brzmienie.
meder omuraliev

2
W przypadku tego wzorca wielokrotnego przypisania należy pamiętać o tym, że każde niezadeklarowane przypisanie w trybie ścisłym ES5 spowoduje ReferenceErrorwyjątek ... IMO, należy ich unikać ...
CMS

64

Używając es6 lub węzła JavaScript, możesz wykonać następujące czynności:

var [a,b,c,d] = [0,1,2,3]

A jeśli chcesz łatwo wydrukować wiele zmiennych w jednym wierszu, po prostu zrób to:

console.log(a, b, c, d)

0 1 2 3

Jest to podobne do odpowiedzi @alex gray, ale ten przykład jest napisany w Javascript zamiast CoffeeScript.

Zauważ, że wykorzystuje to przypisanie niszczenia tablic Javascript


2
dlaczego nie użyć console.log(a,b,c,d)w tym przypadku zamiast tego? jest krótszy i daje taką samą wydajność
Josh Broadhurst

44

Nie da się tego zrobić w jednej linii z przypisaniem jako wartością.

var a = b = 0;

sprawia, że ​​b jest globalny. Prawidłowy sposób (bez wycieków zmiennych) jest nieco dłuższy:

var a = 0, b = a;

co jest przydatne w przypadku:

var a = <someLargeExpressionHere>, b = a, c = a, d = a;

1
„Nie ma możliwości użycia przypisania jako wartości bez powtórzenia 0.” - co masz na myśli?
palswim

28

Dlaczego nie zrobić tego w dwóch wierszach?

var a, b, c, d;    // All in the same scope
a = b = c = d = 1; // Set value to all.

Powodem jest zachowanie lokalnego zakresu w deklaracjach zmiennych, jak poniżej:

var a = b = c = d = 1;

doprowadzi do ukrytych deklaracji b, ca dod zakresu okna.


Było to przydatne dla mnie, ponieważ z góry deklaruję wiele zmiennych w moim programie. Teraz, zamiast robić ponad 30 wierszy, mogę użyć kilku wierszy bez poświęcania czytelności.
Kalif Vaughn

11

Oto nowa metoda deklarowania wielu zmiennych w jednym wierszu w ES6:

const person = { name: 'Prince', age: 22, id: 1 };

let {name, age, id} = person;

console.log(name);
console.log(age);
console.log(id);

* Nazwa zmiennej i indeks obiektu muszą być takie same


2
To dłużej niż pytanie OP, ponieważ jest równoważne z let { a, b } = { a: 0, b: 0 }.
Dan Dascalescu


0

Zauważ, że możesz to zrobić tylko za pomocą liczb i ciągów znaków

mógłbyś...

var a, b, c; a = b = c = 0; //but why?

c++;
// c = 1, b = 0, a = 0;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.