2012-06-16 51 views
5

請原諒我的英語。我不是母語的人。如何編寫|| Javascript中的表達式,其中0不被視爲虛假值?

我的問題是當我寫這樣

luminosity = settings.luminosity || 50; 
opacity = settings.opacity || 100; 

問題代碼是0應該是一個有效的價值,但它會被忽略,因爲0是在Javascript falsy,它會設置爲||右側的默認值。

有沒有辦法做一個修復所以0不被視爲虛假?

現在我做

luminosity = "luminosity" in settings ? settings.luminosity : 50; 

,但我不喜歡這樣,因爲它是那麼的漫長。

+1

我不認爲你可以寫得比這更短。此外,你的方法是可讀的,所以我甚至不會嘗試改變它。 – user123444555621

回答

2

所有你需要做的是寫一個輔助函數...

function ifNotSet(val, other) { 
    return typeof val === "undefined" ? other : val; 
} 
2

你可以把它轉換成字符串'0'truthy

luminosity = settings.luminosity === 0 ? '' + settings.luminosity : settings.luminosity || 50; 
opacity = settings.opacity === 0 ? '' + settings.opacity : settings.opacity || 100; 

或者你可以簡單地使用這取決於你的輸入或要求:

luminosity = '' + settings.luminosity || 50; 
opacity = '' + settings.opacity || 100; 

'' + number簡寫爲一些轉換爲字符串。

+0

'''+ undefined'是''undefined'',所以這並不能解決問題 – user123444555621

2

默認選項/設置的常用方法是.extend() method in jQuery。純JS也有這種方法,但有一些不同。

/* merge object2 into object1 */ 
$.extend(object1, object2); 

這是你所需要的:

var defaultSetting = {luminosity : 50, opacity : 100}; 
setting = $.extend({}, defaultSetting, setting); 
+0

我相信它應該是:'setting = $ .extend({},defaultSetting,setting);'。在上面發佈的答案中,即使已經定義了設置中的屬性,defaultSetting中的屬性也會覆蓋設置中的屬性。 –

+0

是的,你是對的。 –

+1

在這個問題中沒有提到jQuery。 – 2012-06-16 22:40:02

1

調整的初始版本@ Tooraj的代碼:

var setting = {luminosity:0}; 
var defaultSetting = {luminosity:50, opacity:100}; 

setting = $.extend({}, defaultSetting, setting); 

// setting now has a value of {luminosity:0, opacity:100} 

我以前沒做過這個。但它似乎在FF,Chrome和IE9中運行良好。