Javascript'te aynı değere birden çok değişken atayın


177

Bir JavaScript dosyasında küresel kapsamda birkaç değişken başlattım:

var moveUp, moveDown, moveLeft, moveRight;
var mouseDown, touchDown;

Tüm bu değişkenleri yanlış ayarlamanız gerekir, bu şu anda sahip olduğum kod:

moveUp    = false;
moveDown  = false;
moveLeft  = false;
moveRight = false
mouseDown = false;
touchDown = false;

Tüm bu değişkenleri bir kod satırında aynı değere ayarlayabilirsiniz herhangi bir yolu var mı, ya da kod şu anda bunu yapmak için en iyi yolu var mı


8
Tüm okuyucular: Kodunuza en iyi yanıtı uygulamaya karar vermeden önce lütfen aşağıdaki ikinci yanıtı görüntüleyin. Barış.
Govind Rai

Bellekte sadece tek bir değişken olacak ve tüm etkilenecek birinden değerini değiştirirseniz diğerleri o zaman, bu biri için bir kopya veya referans olacaktır çünkü bunu yapmak çalışmayın
Lucas Matos

@LucasMatos İlkel için değil.
Dave Newton

Yanıtlar:


290

Hiçbir şey yapmanı engellemiyor

moveUp = moveDown = moveLeft = moveRight = mouseDown = touchDown = false;

Bu örneği inceleyin

var a, b, c;
a = b = c = 10;
console.log(a + b + c)


13
Değerleri önerdiğiniz şekilde atarken, davranışın ilkel türleri ve referans türlerini nasıl farklılaştıracağını yorumlamak isteyebilirsiniz.
Steven Wexler

26
Evet, bunu bir nesne ile yaparsanız, tüm değişkenler nesnenin diğer adları olacaktır. IE function MyObj(){this.x=1} var a,b; a = b = new MyObj(); ++a.xde b.xmülkü artıracaktır .
AlexMorley-Finch

27
Kapsam belirleme sorunları! stackoverflow.com/questions/1758576/…
doublejosh

4
Görevin solundaki tüm değişkenleri küresel olarak kapsamıyorsanız, bu yaklaşımı kullanmayın diyebilirim
citizen conn

2
@Doublejosh'in dediği gibi, ele almadığınız kapsam sorunları var.
kstratis

90

Hiçbir şey yukarıdakileri yapmanı engellemez, ama dur!

Bazı yakalar var. Javascript'te atama sağdan sola olduğundan yazdığınızda:

var moveUp = moveDown = moveLeft = moveRight = mouseDown = touchDown = false;

etkili bir şekilde çevirir:

var moveUp = (moveDown = (moveLeft = (moveRight = (mouseDown = (touchDown = false)))));

etkili bir şekilde şu anlama gelir:

var moveUp = (window.moveDown = (window.moveLeft = (window.moveRight = (window.mouseDown = (window.touchDown = false)))));

Yanlışlıkla, 5 global değişken oluşturdunuz - yapmak istemediğinizden emin olduğum bir şey.

Not: Yukarıdaki örneğim, kodunuzu tarayıcıda çalıştırdığınızı varsayar window. Eğer farklı bir ortamda olsaydınız, bu değişkenler o ortam için ne olursa olsun küresel bağlamı eklerdi (örneğin, Node.js'de, o ortam için globalhangi küresel bağlamı ekleyeceğini ).

Şimdi önce tüm değişkenlerinizi bildirebilir ve sonra aynı değere atayabilirsiniz ve problemden kaçınabilirsiniz.

var moveUp, moveDown, moveLeft, moveRight, mouseDown, touchDown;
moveUp = moveDown = moveLeft = moveRight = mouseDown = touchDown = false;

Uzun lafın kısası, her iki yol da iyi çalışır, ancak ilk yol potansiyel olarak kodunuzda bazı zararlı hatalar getirebilir. Kesinlikle gerekli değilse, küresel ad alanını yerel değişkenlerle doldurmanın günahını yapmayın.


Sidenote: Yorumlarda belirtildiği gibi (ve bu sadece bu soruda değil), eğer söz konusu kopyalanan değer ilkel bir değer değil, bir nesne ise, değere göre kopyala referansa göre kopyalamayı daha iyi bilirsiniz. Nesneleri her atadığınızda, nesneye yapılan başvuru gerçek nesne yerine kopyalanır. Tüm değişkenler yine de aynı nesneyi gösterecektir, bu nedenle bir değişkenteki herhangi bir değişiklik diğer değişkenlere yansıtılacaktır ve niyetiniz referansı değil nesne değerlerini kopyalamaksa büyük bir baş ağrısına neden olacaktır.


2
bunu let ile aynı yaparsak ne olur?
P-RAD

moveUpBlok kapsamına girmenin yanı sıra , hiçbir fark yaratmaz. 5 global değişken halen açıklanacaktır.
Govind Rai

1
@GovindRai var a, b, c; a = b = c = 10;çok farklı var a = b = c = 10;. Yani, kabul edilen cevap doğrudur. Kabul edilen cevapla ilgili olmayan bir sorunu ele alıyorsunuz.
Elis Byberi

1
@ElisByberi Yorumunuz için teşekkür ederiz. Hatalı değilsin. Cevabımın amacı, kabul edilen cevaptaki ilk cümleyi ele almaktı. Bununla ilgili cevabımda daha fazla netlik sağladım.
Govind Rai

1
@ P-RAD Ekleme kapsamında yalnızca let kullanılarak bildirilen ilk değişken bulunur.
Uday Hiwarale

9

Aynı değere birden çok değişken başlatmaya çalışırken global gotcha'ları tanımayan başka bir seçenek daha vardır. Uzun yoldan tercih edilip edilmeyeceği bir yargılama çağrısıdır. Muhtemelen daha yavaş olacaktır ve daha okunabilir olabilir veya olmayabilir. Özel durumunuzda, uzun yolun daha hızlı olmanın yanı sıra muhtemelen daha okunabilir ve bakımı kolay olduğunu düşünüyorum.

Diğer bir yol kullanır bozma devir .

let [moveUp, moveDown,
     moveLeft, moveRight,
     mouseDown, touchDown] = Array(6).fill(false);

console.log(JSON.stringify({
    moveUp, moveDown,
    moveLeft, moveRight,
    mouseDown, touchDown
}, null, '  '));

// NOTE: If you want to do this with objects, you would be safer doing this
let [obj1, obj2, obj3] = Array(3).fill(null).map(() => ({}));
console.log(JSON.stringify({
    obj1, obj2, obj3
}, null, '  '));
// So that each array element is a unique object

// Or another cool trick would be to use an infinite generator
let [a, b, c, d] = (function*() { while (true) yield {x: 0, y: 0} })();
console.log(JSON.stringify({
    a, b, c, d
}, null, '  '));

// Or generic fixed generator function
function* nTimes(n, f) {
    for(let i = 0; i < n; i++) {
        yield f();
    }
}
let [p1, p2, p3] = [...nTimes(3, () => ({ x: 0, y: 0 }))];
console.log(JSON.stringify({
    p1, p2, p3
}, null, '  '));

Bu bir dizi başlatmayı sağlar var, letya da consthepsi aynı beklenen kapsamı ile tek bir satırda aynı değere değişkenler.

Referanslar:


1
Ancak dikkatli olun. Bu yöntemi kullanarak birden çok değişkene Nesne, işlev veya dizi atarsanız, her değişken samenesnenin diğer adı olur . Birindeki değişiklikler diğerlerini etkileyecektir ...
Doug Coburn

0

Listelediğiniz orijinal değişkenler, yıkım ataması kullanılarak kısa bir kod satırında aynı değere bildirilebilir ve atanabilir. Anahtar kelimeler let, constve vartüm atama türü için kullanılabilir.

let [moveUp, moveDown, moveLeft, moveRight, mouseDown, touchDown] = Array(6).fill(false);

-6

Değişkeni bir diziye koyun ve aynı değeri birden çok değişkene atamak için a for Loop kullanın.

  myArray[moveUP, moveDown, moveLeft];

    for(var i = 0; i < myArray.length; i++){

        myArray[i] = true;

    }

3
Bu çok yanlıştır.İlk ifade sözdizimsel değildir ve for döngüsü sadece myArray dizinlerine değerler atamaktır.
undefinederror
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.