【问题标题】:Javascript ternary operator resultJavascript三元运算符结果
【发布时间】:2016-06-26 23:41:34
【问题描述】:

我正在制作使用 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",而不是那些。谁能解释一下它背后的逻辑。

【问题讨论】:

  • 我建议不要嵌套三元运算符。虽然拥有单行代码总是很好,但如果您将其拆分为 if-else 语句,其他开发人员更容易理解。我曾经不得不处理一个包含多达 6 个嵌套三元组的应用程序。这是一个调试的野兽。
  • 请用大括号()区分表情,方便大家看。它很可能也会给你想要的结果。
  • 嵌套三元组是个糟糕的主意..
  • 我正在制作一个 javascript 编译器。我一般不会写这样的代码。但是如果没有语法错误,编译器应该从用户那里获取任何东西。

标签: javascript ternary-operator


【解决方案1】:

基于operator precedence table

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

所以你的代码将被评估如下,

  1. var a = k 11 ? "T" : "F" : o
  2. var a = true ? o += 2 > 11 ? "T" : "F" : o
  3. var a = true ? o += false ? "T" : "F" : o
  4. var a = true ? o += "F" : o
  5. var a = true ? "78F" : o
  6. var a = "78F"

您可以通过使用括号对条件进行分组来纠正行为,

var a = (k < 100) ? (o+=2) > 11 ? "T" : "F" : (o < 100) ? "J" : "P";
console.log(a); // T

【讨论】:

    【解决方案2】:

    这实际上是这样工作的 k &lt; 100 ? o += (2 &gt; 11 ? "T" : "F") : (o &lt; 100 ? "J" : "P");

    因为赋值运算符 = 右侧的任何内容都会首先按从左到右的顺序进行处理,因此首先计算 2 &gt; 11 ? "T" : "F"

    【讨论】:

      【解决方案3】:
      var k = 27;
      var o = 78;
      var a = k < 100 ? (o+=2) > 11 ? "T" : "F" : o < 100 ? "J" : "P";
      alert(a);
      

      以上代码按您的预期工作。 您可能认为+= 运算符会被首先处理。

      【讨论】:

        【解决方案4】:

        您在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"));
        

        【讨论】:

          猜你喜欢
          • 2015-09-21
          • 2019-01-22
          • 1970-01-01
          • 2022-01-11
          • 2018-08-18
          • 2020-04-29
          • 2023-01-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多