问题:该函数未返回预期的值(3)。
以下代码未按预期评估返回1.我发现这是由于使用了三元运算符。那么三元会导致返回值出乎意料吗?它优先吗?根据mdn规范,三元运算符是右关联的。
function foo()
{
var x = 1;
var flag = true;
function bar(a,b)
{
return a + b;
}
var y = bar(2,2) - (flag) ? x : 0;
return y;
}
alert(foo());
请注意,如果我修改了这行:
var y = bar(2,2) - (flag) ? x : 0;
到
var y = bar(2,2) - ((flag) ? x : 0);
上述代码将按预期返回3。
另请注意,如果我用任何类型的浮动
替换该函数var y = 3 - (flag) ? x : 0;
将相同的意外返回值计算为1。
答案 0 :(得分:2)
这个问题是你假设空格或括号自动分隔。
var y= bar(2,2) - (flag) ? x : 0;
与
相同var y= (bar(2,2) - (flag)) ? x : 0;
并且与
不同var y= bar(2,2) - ((flag) ? x : 0);
答案 1 :(得分:1)
那是因为当你离开这样的代码时:
var y = bar(2,2) - (flag) ? x : 0;
评估为:
var y = (bar(2,2) - (flag)) ? x : 0;
答案 2 :(得分:1)
你猜对了:它是优先的。在三元运算符之前评估运算符-
。
var y = bar(2,2) - (flag) ? x : 0;
评估为
var y = (bar(2,2) - (flag)) ? x : 0;
您可以在此处查看运算符优先级:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
请注意"条件" (三元)运营商在列表中排名靠前。