javascript:三元运算符的意外求值行为
问题:函数未返回预期值(3) 以下代码的计算结果与预期不符,返回1。我发现这是由于使用了三元运算符。三元函数会导致返回值意外吗?是优先权吗?根据mdn规范,三元运算符是右关联的javascript:三元运算符的意外求值行为,javascript,ternary-operator,operator-precedence,Javascript,Ternary Operator,Operator Precedence,问题:函数未返回预期值(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
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;
到
上述代码将按预期运行,返回3
还要注意,如果我用任何类型的浮点替换函数
var y = 3 - (flag) ? x : 0;
相同的意外返回值被计算为1。这是因为当您像这样离开代码时:
var y = bar(2,2) - (flag) ? x : 0;
其评估结果如下:
var y = (bar(2,2) - (flag)) ? x : 0;
这是因为当您像这样离开代码时:
var y = bar(2,2) - (flag) ? x : 0;
其评估结果如下:
var y = (bar(2,2) - (flag)) ? x : 0;
这个问题是假设空格或括号自动定界
var y= bar(2,2) - (flag) ? x : 0;
与
var y= (bar(2,2) - (flag)) ? x : 0;
这和
var y= bar(2,2) - ((flag) ? x : 0);
这个问题是假设空格或括号自动定界
var y= bar(2,2) - (flag) ? x : 0;
与
var y= (bar(2,2) - (flag)) ? x : 0;
这和
var y= bar(2,2) - ((flag) ? x : 0);
你猜对了:这是先兆。运算符
-
在三元运算符之前求值
var y = bar(2,2) - (flag) ? x : 0;
被评估为
var y = (bar(2,2) - (flag)) ? x : 0;
您可以在此处看到运算符优先级:
请注意,“条件”(三元)运算符在列表中的位置较低。您猜对了:它是先行项。运算符
-
在三元运算符之前求值
var y = bar(2,2) - (flag) ? x : 0;
被评估为
var y = (bar(2,2) - (flag)) ? x : 0;
您可以在此处看到运算符优先级:
请注意,“条件”(三元)运算符位于列表的下方