Ruby'nin || = (veya eşittir) JavaScript'te?


128

Ruby'nin ||=mekanizmasını seviyorum . Bir değişken yoksa veya mevcutsa nil, onu oluşturun ve bir şeye eşit olarak ayarlayın:

amount # is nil
amount ||= 0 # is 0
amount ||= 5 # is 0

Şimdi JavaScript'te benzer bir şey yapmam gerekiyor. Bunu yapmanın gelenek veya uygun yolu nedir? ||=Geçerli sözdizimi olmadığını biliyorum . Bunu halletmenin 2 bariz yolu:

window.myLib = window.myLib || {};

// or

if (!window.myLib)
  window.myLib = {};

Yanıtlar:


152

Her ikisi de kesinlikle doğru, ancak ||=yakutta olduğu gibi çalışan bir şey arıyorsanız . variable = variable || {}Aradığınız ilk yöntem :)


1
İçin geçerli bir değer xyanlışsa, gibi false, ve yalnızca xtanımsız olduğunda bir varsayılan ayarlamak istiyorsanız bunu kullanırken dikkatli olun .
Joshua Pinter

yukarıdaki yorum doğrudur. Örnek durumunuzu ele alırsak, JS'de aynı şekilde çalışmayacaktır. let amount = 0;ve ardından amount = amount || 5 miktarı 5 olarak değiştirir . ??Bunun olmasını istemiyorsanız yerine operatör kullanın ||.
AshwinKumarS

@AshwinKumarS Veya sadece kullanın amount ??= 5;.
user4642212

@ user4642212 Sözdiziminin JS'de çalıştığını düşünmüyorum, değil mi?
AshwinKumarS

@AshwinKumarS Evet, öyle. Bkz dokümantasyon , şartname , öneri .
user4642212

22

Yanlış bir değer ||olup olmadığını doğru işleneni değerlendiren mantıksal OR operatörünü kullanabilirsiniz lVal.

Yanlış değerler şunları içerir: null, false, 0, "", undefined, NaN

x = x || 1

İçin geçerli bir değer xyanlışsa, gibi false, ve yalnızca xtanımsız olduğunda bir varsayılan ayarlamak istiyorsanız bunu kullanırken dikkatli olun .
Joshua Pinter

4

Nesnelerle çalışıyorsanız, yıkmayı (ES6'dan beri) şu şekilde kullanabilirsiniz:

({ myLib: window.myLib = {} } = window);

... ama kabul edilen cevabın üzerinde kafa karışıklığı dışında hiçbir şey kazanmazsınız.


1
"ama kabul edilen cevabın üzerinde kafa karışıklığı dışında hiçbir şey kazanamazsın" - güzel. :)
lindes

Bahse girerim birisi bunu javascript'ten nefret etmek için bir sebep olarak kabul edecek
Volper


-1

Ruby'nin || = operatör kısa devre ataması. Şöyle düşünülebilir:

return a || a = b

Yani javascript'te bu çok benzer görünüyor:

return a || (a = b);

Bununla birlikte, aşağıdaki yorumlarda belirtildiği gibi, bu literal ruby ​​formunun standart javascript deyiminden a = a || b.

Referans için: http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html


1
Uygulamada, a = a || bformun daha uygun olduğu görülüyor jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3
jchook

ah harika bir araç. x'in bir değeri varsa ve bu kadar kısa devreleri varsa bu nasıl görünür?
chris

Teardown'ın jsperf'te açık olması gerektiğine inanıyorum, bu yüzden bu test kısa devre performansını göstermelidir. Tahminimce V8'in form için özel bir optimizasyonu var a = a || b.
jchook

3
Bilginize Görünüşe göre, var olan fark ne olursa olsun, şimdi optimize edilmiş.
Charles Wood

a || (a = b)işlev adlarını çıkarmak için doğru semantiğe sahiptir. Şu anda yeni teklif için görüşülüyor .
user4642212

-1

Sadece tamsayılar için javascript'te | = operatörünü kullanarak istenen davranışı elde edebilirsiniz. Ama önce değişkeni tanımlamalısın.

let a = 0
a |= 100
console.log(a) // 100

Nesneler için

let o = {}
o.a |= 100
console.log(o) // {a: 100}

Diziler için

let arr = []
arr[0] |= 100
console.log(arr) // [100]

Soru |veya ile ilgili değil |=. Soruda istenen davranış, bitsel işlemlerle ilgisizdir.
user4642212

Haklısın, cevabı buna göre düzenleyeceğim
wallgeek

Düzenlenen. Umarım şimdi mantıklıdır.
wallgeek
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.