Javascript三元运算符结果

时间:2016-03-11 16:21:45

标签: javascript ternary-operator

我正在使用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”。任何人都可以向我解释它背后的逻辑。

4 个答案:

答案 0 :(得分:9)

基于operator precedence table

  

赋值运算符的优先级低于比较运算符。

因此,您的代码将按如下方式进行评估,

  1. var a = k&lt; 100? o + = 2> 11? &#34; T&#34; :&#34; F&#34; :o&lt; 100? &#34; J&#34; :&#34; P&#34;;
  2. var a = true? o + = 2> 11? &#34; T&#34; :&#34; F&#34; :o&lt; 100? &#34; J&#34; :&#34; P&#34 ;;
  3. var a = true? o + = false? &#34; T&#34; :&#34; F&#34; :o&lt; 100? &#34; J&#34; :&#34; P&#34;;
  4. var a = true? o + = "F":o&lt; 100? &#34; J&#34; :&#34; P&#34;;
  5. var a = true"78F":o&lt; 100? &#34; J&#34; :&#34; P&#34;;
  6. var a = "78F"
  7. 您可以通过使用括号

    对条件进行分组来纠正行为
    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"