Javascript Tek bir satırda birden çok değişken nasıl tanımlanır?


103

Belgeleri çevrimiçi okurken, tek bir satırda birden çok JavaScript değişkenini nasıl doğru şekilde tanımlayacağımı kafam karıştı.

Aşağıdaki kodu yoğunlaştırmak istersem, tek bir satırda birden çok javascript değişkenini tanımlamanın doğru JavaScript "katı" yolu nedir?

var a = 0;
var b = 0;

Bu mu:

var a = b = 0;

veya

var a = var b = 0; 

vb...


1
Çoklu atama hakkında daha fazla bilgi: Değişken atama JavaScript'te nasıl çalışır? . Bu kalıbı, yapıcı işlevlerini ortaya çıkarmak için bir kapanış içinde yararlı buluyorum:var $cls = my.namespace.Foo = function(args){ ... }
blong

İlk başta neden yoğunlaştırmak istediğinizi merak ediyorum. IMHO'nun bir değişkeni birbiri ardına bildirmesi ve ataması çok daha net ve herkes için anlaşılması daha kolaydır.
Henning

Yanıtlar:


76

Virgüllere güvenmek istersiniz çünkü çoklu atama yapısına güvenirseniz, bir noktada kendinizi ayağınıza vurursunuz.

Bir örnek şöyle olabilir:

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

Hepsi bellekteki aynı nesneyi ifade eder, bir nesneye (dizi, nesne değişmezi, işlev) başvuruda bulunduğunuzda, değere göre değil, başvuruya göre iletildiği için "benzersiz" değildirler. Dolayısıyla, bu değişkenlerden yalnızca birini değiştirirseniz ve bireysel olarak hareket etmelerini isterseniz, istediğiniz şeyi elde edemezsiniz çünkü bunlar tek tek nesneler değildir.

İkincil değişkenlerin global olması ve global ad alanına sızmak istememeniz gibi çoklu atamada da bir dezavantaj vardır.

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

Okunabilmesi için virgül kullanmak ve tercihen çok sayıda boşluk kullanmak en iyisidir:

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

2
Bu, yalnızca değer olarak atama ifadelerinde değil, genel olarak dizi referanslarının atanmasıyla ilgili bir sorun.
Matthew Flaschen

"Sayısal değişmez değerler gibi şeyler için birden fazla sağ el atamasından
kurtulabilirsiniz

1
@meder, bu herhangi bir atamayla ilgili bir sorun. Sağ elin özel bir yanı yok.
Matthew Flaschen

Genel olarak ödevleri kastetmiştim. İfadeler düzenlendi.
meder omuraliev

2
Bu çoklu atama modeliyle ilgili akılda tutulması gereken bir şey, ES5 Katı Modu altındaki herhangi bir bildirilmemiş atamanın bir ReferenceErroristisnaya neden olacağıdır ... IMO, kaçınılmalıdır ...
CMS

64

Javascript'in es6'sını veya düğümünü kullanarak aşağıdakileri yapabilirsiniz:

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

Ve tek bir satırda birden çok değişkeni kolayca yazdırmak istiyorsanız, şunu yapın:

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

0 1 2 3

Bu, @alex grey'nin buradaki cevabına benzer, ancak bu örnek CoffeeScript yerine Javascript içindedir.

Bunun Javascript'in dizi bozma atamasını kullandığını unutmayın


2
console.log(a,b,c,d)bunun yerine neden bu durumda kullanmıyorsunuz ? daha kısa ve aynı çıktıyı veriyor
Josh Broadhurst

44

Değer olarak atama ile bunu tek satırda yapmanın bir yolu yoktur.

var a = b = 0;

b'yi global yapar. Doğru yol (değişkenler sızdırmadan) biraz daha uzundur:

var a = 0, b = a;

bu durumda kullanışlıdır:

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

1
"0'ı tekrarlamadan atamayı değer olarak kullanmanın bir yolu yoktur." - ne demek istiyorsun?
palswim

28

Neden iki satırda yapmıyorsunuz?

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

Bunun nedeni, aşağıdaki gibi değişken bildirimlerinde yerel kapsamı korumaktır:

var a = b = c = d = 1;

örtülü beyanlarına yol açacaktır b, cve dpencere kapsamına.


Bu benim için yararlı oldu çünkü programımda birçok değişkeni önceden tanımlıyorum. Şimdi, 30+ satır almak yerine, okunabilirlikten ödün vermeden birkaç satır kullanabilirim.
Kalif Vaughn

11

İşte tek satırda birden çok değişkeni bildirmenin yeni ES6 yöntemi:

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

let {name, age, id} = person;

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

* Değişken adınız ve nesne dizininizin aynı olması gerekir


2
Bu, OP'nin sorusundan daha uzun çünkü eşdeğer let { a, b } = { a: 0, b: 0 }.
Dan Dascalescu


0

bunu yalnızca Sayılar ve Dizelerle yapabileceğinizi unutmayın

yapabilirsin ...

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

c++;
// c = 1, b = 0, a = 0;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.