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

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

另请注意,如果我将函数替换为任何类型的 float

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);

关于javascript:三元运算符的意外评估行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20861029/

相关文章:

javascript - 经过一段时间后,可观察运算符将其变为 "do"

php - 我可以在 PHP 类方法返回语句中使用三元组吗?

javascript - 防止 Javascript ChildNodes 解析 < 和 >

javascript - 卡住 Bootstrap 中的第一行和第一列

TCL 三元运算符不喜欢空字符串

mysql - 我如何在 mysql 查询 where 子句中为 OR 提供比 AND 更高的优先级?

c++ - 不指定函数参数求值的确切顺序如何帮助 C 和 C++ 编译器生成优化代码?

SQL 用 'IN' 实现 'OR' 运算符

javascript - then 回调函数中的破坏 promise 链

java - 在三元中使用无界泛化静态函数时如何避免未经检查的强制转换?