我正在使用C#编译javascript块的小实用程序。我试图了解三元运算符的执行流程。现在,当我使用Chrome或Firefox运行javascript时:
var k = 27;
var o = 78;
var a = k < 100 ? o+=2 > 11 ? "T" : "F" : o < 100 ? "J" : "P";
alert(a);
如果“o + = 2”返回false,它应该给我结果“T”或“F”。但不是那些它返回“78F”。任何人都可以向我解释它背后的逻辑。
答案 0 :(得分:9)
赋值运算符的优先级低于比较运算符。
因此,您的代码将按如下方式进行评估,
true
? o + = 2> 11? &#34; T&#34; :&#34; F&#34; :o&lt; 100? &#34; J&#34; :&#34; P&#34 ;; true
? o + = false
? &#34; T&#34; :&#34; F&#34; :o&lt; 100? &#34; J&#34; :&#34; P&#34;; true
? o + = "F"
:o&lt; 100? &#34; J&#34; :&#34; P&#34;; true
? "78F"
:o&lt; 100? &#34; J&#34; :&#34; P&#34;; "78F"
您可以通过使用括号
对条件进行分组来纠正行为var a = (k < 100) ? (o+=2) > 11 ? "T" : "F" : (o < 100) ? "J" : "P";
console.log(a); // T
答案 1 :(得分:3)
var k = 27;
var o = 78;
var a = k < 100 ? (o+=2) > 11 ? "T" : "F" : o < 100 ? "J" : "P";
alert(a);
以上代码按您的预期工作。
您可能认为首先会处理+=
运算符。
答案 2 :(得分:1)
您在+=
上使用的是o
,而不只是+
。
var a = k < 100 ? o+2 > 11 ? "T" : "F" : o < 100 ? "J" : "P";
同样使用括号将使其更具可读性:
var a = (k < 100 ? (o+2 > 11 ? "T" : "F") : (o < 100 ? "J" : "P"));
答案 3 :(得分:1)
这实际上就是这样的
k < 100 ? o += (2 > 11 ? "T" : "F") : (o < 100 ? "J" : "P");
因为首先按从左到右的顺序处理赋值运算符=
右侧的任何内容,所以首先评估2 > 11 ? "T" : "F"