2009-11-18 60 views
3

我最近遇到这个问题,并认为它会产生一个很好的SO问题。JavaScript语法:字符串赋值语句中的内联If

假设你正在给一个局部变量赋值一个字符串,并且你想通过一个简单的条件来改变它。所以你插入的if语句内嵌到字符串:

var someCondition = true; 
var url = "beginning-" + (someCondition)?('middle'):('other_middle') + "-end"; 

但是,这并不如预期,URL的值将是“中等”,没有开始,中端。此声明产生预期结果:

var url = "beginning-" + ((someCondition)?('middle'):('other_middle')) + "-end"; 

最好的解释,为什么这是赢得令人垂涎的答案标志!

+1

这被称为**三元操作符**。以下链接提供了运营商优先权的详细说明:http://blog.stchur.com/2006/07/14/the-javascript-ternary-operator/ – 2009-11-18 23:56:43

回答

9

这当然与优先权有关。

var url = "beginning-" + (someCondition)?('middle'):('other_middle') + "-end"; 

被解释为:

var url = ("beginning-" + (someCondition)) ? ('middle') : (('other_middle') + "-end";) 
4

这是因为运营商的优先级。

第一个例子计算结果为:

if ("beginning-" + someCondition) { 
    url = 'middle'; 
} else { 
    url = 'other_middle' + "-end"; 
} 

因为?操作的优先级高于+

1

在你的第一个例子中,条件运算符的第三个操作数是这样的:

('other_middle') + "-end" 

您需要包装由条件运算符评估的表达式,并且您不需要所有这些括号:

var url = "beginning-" + (someCondition ? 'middle' :'other_middle') + "-end"; 

检查运营商优先权的this table

0

在我看来,像运算符优先级的问题。

JavaScript是解释语句,如:

IF ("beginning-" + (someCondition)) { 
    'middle'; 
} else { 
    'other middle' + "-end"; 
} 

( “开始 - ” +(someCondition))将被连接成一个字符串(例如, “开始-1”),并因为它不为空,它将被评估为布尔真,所以结果将始终为'中间'

0

如果条件也是值。

短手var x = y || z;也不应该被遗忘。

在这种情况下,我想

var url = "beginning-" + (middle || 'middle_was_bad') + "-end"; 

可能是有用的一些人。