2017-06-29 65 views
1

什麼是明確的方式,我可以確定布爾檢查的唯一結果將是「true」或「false 「?換句話說,我想盡可能地排除「未定義」的可能性。兩個選項是:檢查Typescript/Javascript中的布爾值,包括「true」,「false」和「undefined」

功能的一種:

private canMove = (currentOptionSelected): boolean => { 
    if (this.client.services) { 
     for (const service of this.client.services) { 
      if (service === currentOptionSelected) { 
       if (service.currentStage === 'enrolling') { 
        return true; 
       } 
      } 
     } 
    } 
} 

兩個作用:

private canMove = (currentOptionSelected): boolean => { 
    if (this.client.services) { 
     for (const service of this.client.services) { 
      if (service === currentOptionSelected) { 
       return service.currentStage === 'enrolling'; 
      } 
     } 
    } 
} 

編輯:當一個評論者的響應,一個更強大的替代方法是明確地返回「假」,這樣:

private canMove = (currentOptionSelected): boolean => { 
    if (this.client.services) { 
     for (const service of this.client.services) { 
      if (service === currentOptionSelected) { 
       //You should also rethink this return statement 
       return service.currentStage === 'enrolling'; 
      } 
     } 
    } 
    return false; 
} 

我會按照詢問是否增加一個額外的「return'false'」 「client.services」存在的情況,但「currentStage!=='註冊」會更好?或者在這種情況下,第二個'其他'條款是多餘的?

其次,他寫道,我應該重新考慮它在函數中的位置。替代方案會是什麼?總之,我試圖找到編寫這個函數最健壯但最簡單的方法。

+0

[這些JS條件語句在功能上是否等效?](https:// stackoverflow。com/questions/44830141/are-these-js-conditional-statements-functionalally-equivalent) –

+0

第一個將返回'true'或'undefined',第二個'true','false'或'undefined'。 – RobG

+0

一旦'service === currentOptionSelected'爲'true',第一個將返回一個值,而第二個將繼續遍歷其餘元素,如果內部if語句爲'false'。 – 4castle

回答

2

這些不等價。在第一個版本返回undefined的某些情況下,第二個版本返回false。調用者將檢查值明確地爲=== false將會觀察到不同的行爲。

兩者都可以返回undefined,這可能不是很好。這將會是最好的總是與true實際值或返回false

2

簡短的回答是沒有,他們是不等價的:

  • 第一個將不會在任何情況下返回false
  • 雖然第二個可以返回false如果service.currentStage !== 'enrolling'

但正如瑞恩說既可以返回undefined,你應該避免,你需要明確地返回false只要條件不滿足。

這是應該的代碼:

private canMove = (currentOptionSelected): boolean => { 
    if (this.client.services) { 
     for (const service of this.client.services) { 
      if (service === currentOptionSelected) { 
       //You should also rethink this return statement 
       return service.currentStage === 'enrolling'; 
      } 
     } 
    } 
    return false; 
} 

注:

  • 這裏的return false;將確保您返回falsethis.client.servicesundefined
  • for循環中使用return語句這種方法是一個非常糟糕的主意,事實上,您只會進行一次迭代。
+0

爲了澄清,你是否說過你編寫上述函數的方式是一個強大的解決方案?如果「client.services」存在,但「currentStage!=='註冊」會更好,那麼會添加額外的「return'false'」嗎?或者在這種情況下,第二個'其他'條款是多餘的? – Ademo

+0

此外,如果您建議不要以我的方式使用退貨聲明,您會建議作爲替代方案嗎?什麼是寫這個函數的強大方法? – Ademo

+0

@Ademo如果'currentStage!=='註冊「'false」將會自動返回,否則我會說的是該函數只有一個迭代,因爲你在循環中返回,所以它總是會退出在第一次迭代中帶有'return'的函數,但是你能告訴我爲什麼你要這樣使用它,你想要實現什麼? –

相關問題