javascript:使用三元运算符的意外评估行为

时间:2013-12-31 17:27:47

标签: 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 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。

3 个答案:

答案 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

请注意"条件" (三元)运营商在列表中排名靠前。