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

Posted

技术标签:

【中文标题】javascript:使用三元运算符的意外评估行为【英文标题】:javascript: Unexpected Evaluation Behavior with Ternary Operator 【发布时间】: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。

【问题讨论】:

developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 【参考方案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;

【讨论】:

以上是关于javascript:使用三元运算符的意外评估行为的主要内容,如果未能解决你的问题,请参考以下文章

C 三元运算符的意外结果

使用 Python 的三元运算符与 lambda 组合的意外输出

使用三元运算符或仅短路评估之间的区别?

PHP速记三元运算符“?:”解析错误意外“:”

意外结果,Gnu C 中的三元运算符

使用 && 进行单线短路评估 ||在 JavaScript 中