2013-10-11 131 views
-1

我得在調試器監視兩個表達式(在同一時間):評估順序

item.isSelected() === truefalse

,並在同一時間:

(item.isSelected() === true) && !(item.workflowStatusCode.toUpperCase() === "INRV") && (item.productStatusCode.toUpperCase() !== "ACTV") || (item.workflowStatusCode.toUpperCase() === "INPR")true

爲什麼當第一個錯誤時第二個評估爲真?

ADDITION:

here

短路評價

作爲邏輯表達式被從左向右計算,它們被評價使用測試 可能的 「短路」以下規則:

false & &任何東西被短路評估爲false。

...它有點暗示,一旦第一個表達式被評估爲false其餘的應該被跳過......我仍然不清楚這些規則背後是什麼。

+1

顯然'item.workflowStatusCode.toUpperCase()===「INPR」正在計算爲「true」,並且它與表達式的其他部分進行OR運算,因此整體表達式爲「true」。 – bdesham

+0

@bdesham同意 – DontVoteMeDown

+0

因此,他們正在從左到右進行評估,其中每個評估對將成爲下一個評估的結果 ?或者像馬特·鮑爾所說的那樣,它與優先級有關? (如果是這樣,如何) –

回答

1

優先順序可以這樣看。

高於NOTAND高於OR

這意味着:

A && !B && C || D 

求值是這樣的:

((A && (!B)) && C) || D 

評價的順序則是:

  1. !B
  2. A && {1}
  3. {2} && C
  4. {3} || D

因此,如果Dtrue沒有別的事項和表達式的值爲true

順便說一句,如果你把D ||放在開頭,那麼懶惰的評估者會忽略其餘的,如果Dtrue

+0

謝謝。我一定一直盯着這太多。我的原始表達式缺少兩個OR-ed表達式的括號。我問我的問題,我想我有他們。當然,如果沒有它們,它會變得真實。腦痙攣... –

7

|| has lower precedence than &&,所以它幾乎肯定的情況下,這是true

(item.workflowStatusCode.toUpperCase() === "INPR") 
+1

至於一個更簡單的例子,'假&&'任何'|| true'是'true' –

+0

所以如果&&具有更高的優先級,爲什麼不先評估它?即我不是在爭辯,只是試圖更好地理解這一點。這是評估的優先順序還是順序? –

+1

@ G.Stoynev **優先級**確定表達式中隱含的「()」的位置。 – Pointy