Javascript三元运算符结果

Javascript三元运算符结果,javascript,ternary-operator,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); var k=27; var o=78; var a=k11?“T”:“F”:o

我正在使用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);
var k=27;
var o=78;
var a=k<100?o+=2>11?“T”:“F”:o<100?“J”:“P”;
警报(a);
如果“o+=2”返回false,它应该给我结果“T”“F”。但是它返回的不是那些“78F”。谁能解释一下背后的逻辑是什么。

基于:

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

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

  • var a=k<100?o+=2>11?“T”:“F”:o<100?“J”:“P”
  • 变量a=
    true
    ?o+=2>11?“T”:“F”:o<100?“J”:“P”
  • 变量a=
    true
    ?o+=
    false
    ?“T”:“F”:o<100?“J”:“P”
  • 变量a=
    true
    ?o+=
    “F”
    :o<100?“J”:“P”
  • 变量a=
    true
    <代码>“78F”:o<100?“J”:“P”
  • 变量a=
    “78F”
  • 您可以通过使用括号对条件进行分组来纠正该行为

    var a = (k < 100) ? (o+=2) > 11 ? "T" : "F" : (o < 100) ? "J" : "P";
    console.log(a); // T
    
    var a=(k<100)?(o+=2)>11?“T”:“F”:(o<100)?“J”:“P”;
    console.log(a);//T
    
    您在
    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"));
    
    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”);
    
    var k=27;
    var o=78;
    var a=k<100?(o+=2)>11?“T”:“F”:o<100?“J”:“P”;
    警报(a);
    
    上述代码按您的预期工作。
    您可能认为将首先处理
    +=
    运算符。

    这实际上是一种
    k<100?o+=(2>11?:“T”:“F”):(o<100?:“J”:“P”)


    因为赋值运算符
    =
    右侧的任何内容都是先按从左到右的顺序处理的,所以
    2>11?“T”:“F”
    首先计算

    我建议不要嵌套三元运算符。虽然使用一行程序总是很好的,但是如果将其拆分为if-else语句,其他开发人员就更容易理解了。我曾经不得不在一个应用程序上工作,该应用程序的部件中有多达6个嵌套三元组。这是一个需要调试的庞然大物。请使用大括号
    来区分表达式,让每个人的眼睛都更容易看到。嵌套三元组是一个糟糕的主意。我正在制作一个javascript编译器。我一般不这样写代码。但若并没有语法错误,编译器应该从用户那个里获取任何信息。
    var k = 27;
    var o = 78;
    var a = k < 100 ? (o+=2) > 11 ? "T" : "F" : o < 100 ? "J" : "P";
    alert(a);