我最近遇到过这个问题,并认为这会产生一个很好的问题。
假设您要将字符串分配给局部变量,并且希望通过简单条件对其进行更改。所以你在字符串中插入一个内联if语句:
var someCondition = true;
var url = "beginning-" + (someCondition)?('middle'):('other_middle') + "-end";
但是这不能按预期工作,url的值将是“中间”,而不是开始 - 中端。该语句产生预期结果:
var url = "beginning-" + ((someCondition)?('middle'):('other_middle')) + "-end";
为什么这会赢得令人垂涎的答案旗帜的最佳解释!
答案 0 :(得分:9)
这当然与优先权有关。
var url = "beginning-" + (someCondition)?('middle'):('other_middle') + "-end";
被解释为:
var url = ("beginning-" + (someCondition)) ? ('middle') : (('other_middle') + "-end";)
答案 1 :(得分:4)
这是因为运营商的优先权。
第一个示例评估为:
if ("beginning-" + someCondition) {
url = 'middle';
} else {
url = 'other_middle' + "-end";
}
因为?
运算符优先于+
答案 2 :(得分:1)
在第一个例子中,条件运算符的第三个操作数是:
('other_middle') + "-end"
您需要包装由条件运算符计算的表达式,并且BTW您不需要所有这些括号:
var url = "beginning-" + (someCondition ? 'middle' :'other_middle') + "-end";
检查运营商优先级的this table。
答案 3 :(得分:0)
在我看来,这与运营商优先权有关。
Javascript正在解释如下语句:
IF ("beginning-" + (someCondition)) {
'middle';
} else {
'other middle' + "-end";
}
(“begin-”+(someCondition))将被连接成一个字符串(例如,“begin-1”),因为它不是null,所以它将被评估为布尔值True,因此结果将始终为'middle “
答案 4 :(得分:0)
如果条件也是值。
短手var x = y || z;
也不应该被遗忘。
在这种情况下,我猜
var url = "beginning-" + (middle || 'middle_was_bad') + "-end";
对某些人有用。