2009-09-29 80 views
2

我見過這種格式用於JavaScript的代碼,但找不到一個好的意思來源。你如何閱讀這段JavaScript代碼? (var1?var2:var3)

編輯爲後續行動:

感謝您的所有快速答案!我覺得是這樣的。現在,獎勵積分:

可以使用 (VAR1 VAR2?)

做同樣的事情

if (var1) { 
     var2 
    } 

+4

不,你不能。你還必須指定else條件。 – rahul 2009-09-29 06:32:06

+0

關於你的編輯,你會得到最接近的是:'if(var1)stmt;'在一行上。 – 2009-09-29 07:12:44

+0

var1? var2():void(0); – 2009-09-29 07:33:48

回答

17

它被稱爲ternary(因爲它有三個操作數)條件(因爲它是一個的if/else /再)操作

據計算爲一個值,所以通常會使用它分配一個值,如:

var result = condition ? value1 : value2; 

即相當於:

var result; 
if (condition == true) { 
    result = value1; 
} else { 
    result = value2; 
} 

一個例子:

var message = "Length is " + len + " " + (len==1 ? "foot" : "feet"); 

注意?:是完整的運營商。它不是?:運算符,因此?本身在Javascript中沒有意義。

+5

我認爲你的第一個==是一個錯字。 – eyelidlessness 2009-09-29 06:31:07

+3

此外,代碼的兩位不等效,因爲第二位應該在「var result」之前。 – eyelidlessness 2009-09-29 06:51:07

+1

@eyelidlessness - 顯然我不應該在7.30AM之前編碼。我昨天對SO做了同樣的== vs =錯誤。感謝您指出這些。 – 2009-09-29 07:10:14

6

它是一個條件運算符。

這是

如果VAR1然後VAR2其他VAR3

在這裏閱讀更多

Conditional Operator

條件運算符是唯一 JavaScript的運算符需要三個 操作數。該運算符通常是 ,用作if語句的快捷鍵。

+0

我可以知道投票的原因嗎? – rahul 2009-09-29 06:36:34

+3

-1。這確實是在採取錯誤的方針。你不希望值表達式修改任何東西,你只是希望整個表達式的值可以是真正的一側的值,也可以是假的一側的值,這就是這個操作符的目的。 – AnthonyWJones 2009-09-29 06:36:55

+2

@phoenix也許你的例子並沒有完全顯示條件運算符的有用用法。它可以簡化爲'var xCon = num == 1;' – CMS 2009-09-29 06:49:09

2
if(var1) { 
    var2; 
else { 
    var3; 
} 
1

這似乎是一種三元操作。可以這麼說,其他操作的簡寫形式。檢查here瞭解詳細信息...

2

表達var1 ? var2 : var3如果var1被認爲具有等價於true其他的值返回的var3德值返回var2值。

注意這不是完全一樣: -

if (var1) 
    varX = var2 
else 
    varX = var3 

由於上述構建體不能將其自身表現爲較大的表達式的一部分。

在表達式中,因爲已知? :,應避免允許組件表達式具有除++或 - 運算符的副作用以外的副作用。例如,這是不是一個好主意: -

varX = var1 ? doSomethingSignificant() : doSomethingElseSignificant(); 

在這種情況下,它會更好地使用if else結構。一方面: -

varX = var1 ? calcSomething(var2) : someOtherCalc(var2); 

這是可以接受的,假設被調用函數本身並不顯着修改程序狀態。

編輯

我想我需要重新加強了這一點。做不是使用三元運算符作爲簡化語句的方法來簡化if。兩者有不同的目的。如果您的代碼充滿? :應該是if else這將很難閱讀。我們預計邏輯流程將出現在if語句中。當存在表達式的簡單邏輯組件時,我們期望? :。注表達式不要修改的東西只有他們的結果,當分配應該修改的東西。

+0

我認爲一種簡單的方式來說明最後一部分是:三元運算符的工作是根據條件**等於一個值或另一個**,而如果Javascript中的語句根本不產生任何值 - 他們的工作是**執行代碼**。 – Chuck 2009-09-29 07:34:47

+0

@Chuck:這很簡單,但是沒有理由說明爲什麼表達式不應該在三元運算符中執行代碼__,它的代碼的功能(或者更重要的一點)非常重要。理想情況下,程序狀態不應因表達式被評估而改變。 – AnthonyWJones 2009-09-29 08:09:13

2

至於第一個問題的增編,您也可以使用

var result = (condition) && var1 || var2; 

,並獲得相同的結果

對於第二個問題,在C以下的工作太:

(condition) && someinstruction; 

,但似乎並沒有在JavaScript(至少與我的版本的Firefox)工作。

+0

是的,它應該工作。 '(condition)&& someinstruction;'只有'condition'具有真值時才應該評估'someinstruction'。 – kangax 2009-09-29 12:38:51