2013-09-30 6 views
88

Ruby'in ||= mekanizmasını seviyorum. Bir değişken yok veya nil ise vermezse, o zaman yaratmak ve eşit bir şeye ayarlayın:Ruby's || = (veya eşittir) JavaScript'te?

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

Şimdi JavaScript benzer bir şey yapmak gerekir. Bu kongre ya da uygun yolu nedir? Biliyorum ||= geçerli bir sözdizimi değil. Eğer Ruby ||= gibi çalışır şey arıyorsanız eğer

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

// or 

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

cevap

105

ikisi de kesinlikle doğru, ama: idare etmek 2 bariz yollarıdır. variable = variable || {} ilk yöntem lVal bir falsy değer olup olmadığını mantıksal OR onun sağ işlenen değerlendirir operatörü || kullanabilirsiniz :)

14

aradığınız biridir.

Falsy değerler örneğin null,false,0,"",undefined,NaN

var x = x || 1 içerir;

-2

Ruby's || = operatör kısa devreleri atama. Böyle düşünülebilir:

return a || a = b 

Yani javascript, bu çok benziyor

: ancak aşağıdaki yorum belirttiği gibi

return a || (a = b); 

edebi yakut formu daha az etkili olduğunu, görünüyor Standart javascript deyiminden a = a || b. Eğer nesneler ile çalışıyorsanız http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

+0

Pratikte öyle görünüyor ki a = a || b 'formu daha uygun http://jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3 – jchook

+0

ah güzel bir araçtır. x'in bir değeri ve çok kısa devreleri varsa neye benziyor? – chris

+0

Yırtmaların jsperf üzerinde açık olması gerektiğine inanıyorum, bu yüzden [bu test] (http://jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/4) kısa devre performansı. Tahminimce, V8'in form için özel bir optimizasyonu var: a = a || b'. – jchook

4

, siz (ES6 beri) strüktür kullanabilmesi gibi:

Başvuru için

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

... ama üzerinde hiçbir şey kazanmazlar karışıklık dışında kabul edilen cevap.