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:使用三元运算符的意外评估行为的主要内容,如果未能解决你的问题,请参考以下文章