2011-05-01 63 views
7

我想問一下爲什麼爲什麼 「警報(3> 2> 1)」 警惕 「假」

alert(3>2>1); // (1) 

在JavaScript中返回FALSE。

我知道,正確的是:

alert(3>2 && 2>1); // (2) 

但代碼1應返回一個錯誤信息或者是TRUE!這個等式返回FALSE是否有特定的原因?

+3

我的猜測是:(1)被解釋爲'真> 1'但是這是一個大膽猜測 – Zlatev 2011-05-01 23:05:30

回答

6

第一個3>2的計算結果爲TRUE,可能會被隱式轉換爲1,所以最終結果爲,這是FALSE。

您可能需要在此輸入錯誤,但Javascript輸入非常弱,因此它會嘗試執行隱式轉換,而不會抱怨。

編輯:

所以,你問爲什麼編程語言的語法並不總是與數學符號一致?我會說(1)他們有不同的優先級,(2)編譯器以另一種方式做更有意義。

這種情況並不少見,但:

  • 「X = 3」(陳述)和x = 3(分配)
  • 「X >> 1」(遠遠大於1)和x >> 1(位位移)
  • 「a | b」(a除以b)和a | b(按位或)。

這樣的例子不勝枚舉...

4

它正在評估,如:

+(3>2) > 1 

這是一樣的:

+(true) > 1 

這總算是:

1 > 1 = false 

但是,嘿,至少3 > 2 > 0將工作;)

31

如果您添加括號顯示JavaScript是如何解釋它,它就會更加清晰:

alert((3 > 2) > 1); 

讓我們除了選擇這個。首先,它評估3 > 2。是的,三個大於兩個。因此,你現在有這樣的:

alert(true > 1); 

true被強制轉化爲數字。這個數字恰好是11 > 1顯然是錯誤的。因此,其結果是:

alert(false); 
+0

是的傢伙,我知道什麼是發生。我在問爲什麼..他們爲什麼不解決這個問題? – George 2011-05-01 23:09:33

+13

@George - ...因爲它沒有損壞。 – 2011-05-01 23:12:55

+1

修復什麼?它的工作原理應該如此。 – 2011-05-01 23:14:17

0

讓我們打破它從根本上,它的兩個>與相同優先級的運營商,所以哪一個先運行?

JavaScript有運算符優先級分配,作爲每個從 MDN

大下載操作優先級表(>)(在表11)運行從左到右,所以3> 2運行第一其評估爲TRUE

所以現在我們有TRUE> 1,

JavaScript時看到兩種不同類型的值(布爾和數量在這裏)爲了進行比較,類型強制會發生,這意味着TRUE將被裹挾(類型轉換)爲1,

所以的JavaScript將運行1> 1,這將導致爲FALSE

enter image description here