【问题标题】:javascript: Unexpected Evaluation Behavior with Ternary Operatorjavascript:使用三元运算符的意外评估行为
【发布时间】:2014-01-18 14:34:16
【问题描述】:

问题:函数没有返回预期的值 (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。

【问题讨论】:

标签: javascript ternary-operator operator-precedence


【解决方案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

请注意,“条件”(三元)运算符位于列表中。

【讨论】:

    【解决方案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);
    

    【讨论】:

      【解决方案3】:

      那是因为当你留下这样的代码时:

      var y = bar(2,2) - (flag) ? x : 0;
      

      计算结果如下:

      var y = (bar(2,2) - (flag)) ? x : 0;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        • 2020-02-08
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多