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.