Javascript 三元运算结果

Javascript ternary operator result

我正在制作使用 C# 编译 javascript 块的小工具。我试图了解三元运算符的执行流程。现在,当我 运行 a javascript 使用 Chrome 或 Firefox 时:

var k = 27;
var o = 78;
var a = k < 100 ? o+=2 > 11 ? "T" : "F" : o < 100 ? "J" : "P";
alert(a);

它应该给我结果 "T" 或者 "F" 如果 "o+=2" returns 错误。但不是那些 returns "78F"。谁能解释一下背后的逻辑是什么。

基于operator precedence table

Assignment operators has less priority than a comparison operator.

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

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

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

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 k = 27;
var o = 78;
var a = k < 100 ? (o+=2) > 11 ? "T" : "F" : o < 100 ? "J" : "P";
alert(a);

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

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

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