javascript:三元运算符的意外求值行为

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

问题:函数未返回预期值(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;

上述代码将按预期运行,返回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;
您可以在此处看到运算符优先级:

请注意,“条件”(三元)运算符位于列表的下方