2015-09-11 61 views
-1
if (!this.initialized || (typeof this.activeId !== 'undefined' && options.qualification_id !== this.activeId)) { 
    //Stuff 
} 

如果this.initialized標誌爲false或this.activeId的值與options.qualification_id不相同,我想執行代碼。我必須檢查是否定義了this.activeId,因爲在undefined的情況下Javascript將返回true!== this.activeId。以上是我提出的條件,但我討厭它有多長。最簡單的寫法是什麼?如何縮短這個條件?

+0

如果定義了'this.activeId',那麼它的任何可能的值都是falsey值?即Id可以是0嗎? – Barmar

回答

0

如果當它被定義爲this.activeId有效的值都truthy(例如,它不能0false,或null),你可以使用:

if (!this.initialized || this.activeId && options.qualification_id != this.activeId) 
0

讓我們看看你能做些什麼來縮短這

(!this.initialized || (typeof this.activeId !== 'undefined' && options.qualification_id !== this.activeId)) 

首先,您可以刪除內部括號。根據operator precedence表,邏輯AND具有比「邏輯或」更高的「優先級」。換句話說,口譯員會爲您添加括號。所以,你的病情變成:

(!this.initialized || typeof this.activeId !== 'undefined' && options.qualification_id !== this.activeId) 

好多了。你可以做的另一件事是利用JS類型轉換。 undefined值falsey(進行評估,以false),你的情況可以成爲:

(!this.initialized || this.activeId && options.qualification_id !== this.activeId) 

然而,這可能會插入一個無聲的錯誤,因爲的0activeId也將進行評估,以false。您可以使用in運算符來解決此問題,該運算符會檢查該對象或其某個原型上是否存在該屬性(爲了確保該屬性不是來自其原型之一,可以使用hasOwnProperty方法)。

(!this.initialized || 'activeId' in this && options.qualification_id !== this.activeId). 

現在說實話,這對我來說並不好看。通常,每當線條變得太長時,只需將其分成多行以增加可讀性。

var qualificationIsDifferent = options.qualification_id !== this.activeId; 
var isNotActive = this.hasOwnProperty('activeId') && qualificationIsDifferent; 
var shouldDoStuff = !this.initialized || isNotActive; 

if (shouldDoStuff) { ... } 

請注意,通過使用上述方法,您將失去short-circuit evaluation的一些好處。 這真的取決於你的目標,有時更冗長意味着更具可讀性。