2016-03-11 99 views
6

我正在編寫使用C#編寫javascript塊的小工具。我想了解三元運算符的執行流程。現在,當我運行使用Chrome或Firefox的一個javascript:Javascript三元運算符結果

var k = 27; 
var o = 78; 
var a = k < 100 ? o+=2 > 11 ? "T" : "F" : o < 100 ? "J" : "P"; 
alert(a); 

它應該有給我造成「T」「F」如果「O + = 2」返回false。但不是那些返回「78F」。任何人都可以請解釋一下它背後的邏輯。基於該operator precedence table

+11

我會建議不要嵌套三元運營商進行評估。儘管擁有一行代碼總是很好的,但其他開發人員可以更容易理解是否將它分解爲if-else語句。我曾經不得不在一個應用中使用多達6個嵌套三元組。這是一個調試的野獸。 – HockeyJ

+1

請使用大括號'('和')'來區分表達式,並讓每個人的眼睛更容易。它很可能會給你想要的結果。 – Aukhan

+1

嵌套三元組是一個可怕的想法.. – rlemon

回答

9

賦值運算符具有比比較算符優先以下。

所以你的代碼會像下面評估,

  1. VAR一個= K < 100? o + = 2> 11? 「T」:「F」:o < 100? 「J.P」;
  2. var a = true? o + = 2> 11? 「T」:「F」:o < 100? 「J.P」;
  3. var a = true? o + = false? 「T」:「F」:o < 100? 「J.P」;
  4. var a = true? o + = "F":o < 100? 「J.P」;
  5. var a = true"78F":o < 100? 「J.P」;
  6. VAR一個= "78F"

,您可以通過使用圓括號分組的情況糾正行爲,

var a = (k < 100) ? (o+=2) > 11 ? "T" : "F" : (o < 100) ? "J" : "P"; 
console.log(a); // T 
1

您在o,而不是僅僅使用++=

var a = k < 100 ? o+2 > 11 ? "T" : "F" : o < 100 ? "J" : "P"; 

而且使用圓括號將使其更易於閱讀:

var a = (k < 100 ? (o+2 > 11 ? "T" : "F") : (o < 100 ? "J" : "P")); 
3
var k = 27; 
var o = 78; 
var a = k < 100 ? (o+=2) > 11 ? "T" : "F" : o < 100 ? "J" : "P"; 
alert(a); 

上面的代碼工作由您預期。 您可能認爲+=運算符會先被處理。

1

這實際上是工作像 k < 100 ? o += (2 > 11 ? "T" : "F") : (o < 100 ? "J" : "P");

因爲賦值運算符=的右側東西,首先處理,在從左到右的順序,所以2 > 11 ? "T" : "F"首先