2009-09-29 76 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