2015-06-14 147 views
1

我正在閱讀代碼,該代碼顯示如何使用邏輯運算符「if」語句運算符。如果語句沒有if if

someBoolean && (someStatement = 10); 

等於:

if(someBoolean) { 
someStatement = 10;} 

我知道如何& &作品。但在這個例子中,我無法理解它是如何工作的。

& &運營商是這樣的:如果第一個值是假的,它會被退回,否則它會搜索,直到它找到一個錯誤值。如果不是,則返回最後一個值。

在此示例中,如果someBoolean爲false,則將返回「someBoolean」!否則「(someStatement = 10)」部分將被返回。

但它恰恰與「如果」相反。不是嗎?

+3

是的,這是一個不太可讀的方式來做到這一點。如果左側爲真,則邏輯AND運算符僅進入右側。 – adeneo

+0

你沒看完我的問題! –

+0

@AmirJalilifard也許,但我認爲你並沒有完全探索adeneo的說法。這只是一個表達,恰好有一方面的任務。 –

回答

5

但它恰恰與「如果」相反。不是嗎?

不,結果與if聲明具有相同的效果。

如果第一個操作數(someBoolean)爲假,那麼該值將用於整個表達式,並且第二個操作數(someStatement = 10)不會被評估,因爲它不是必需的。

如果第一個操作數爲真,則必須對第二個操作數進行求值以確定整個表達式的值。

1

如果someBoolean爲真,則表達式的其餘部分將進行評估,即(someStatement = 10)

值不是由if聲明「返回」,它們是評估

該方法忽略了表達式的結果,這很好。

我不會使用它;這是更多的認知開銷。雖然這只是一個意見。

2

它的工作原理類似於if,因爲在第一個表達式評估爲true之後,第二個評估爲true。與此相反,如果第一個exprssion評估爲false,則不會評估第二個表達式。在下面的例子中,b的值永遠不會被分配,因爲第二個if以虛假& &開頭。您將在第二次提醒中看到「未定義」。

var a; 
 
if(true && (a = 10)) 
 
    alert(a) //alerts 10 
 

 
var b; 
 
if(false && (b = 5)) 
 
    alert(b) //never alerts b/c of the false above 
 
     
 
alert(b); //alerts undefined b/c (b = 5) is never evaluated

4

使用邏輯語句的關鍵是理解Short-circuit Evaluation(你在你的問題暗示)。確切地說,沒有什麼是「返回」 - 但我認爲你的意思是「評估」 - 但由於結果沒有被捕獲,這個評估將會丟失。

但是這種對「if」的方法對最終結果不感興趣,它只是使用短路評估來有條件地評估表達式的第二部分,如果第一部分爲真。

因此,一些例子:

  • x && (y = 10):只分配10到y如果x是真實的
  • x || (y = 10):只分配10到y如果x是假
  • !x || (y = 10):只分配10到y如果x是真的

這種風格當然很難讀,所以一般不推薦用於源代碼。儘管我經常用縮小的代碼來看它,因爲它可以節省幾個字符。

+0

很好的解釋,特別是包括短路評估,縮小代碼和示例。 – ThisClark