三元运算符的赋值忽略剩余的表达式

Assignment from ternary operator ignores remaining expression

这样做

const bool = true;
const a = 2 + true ? 3 : 0;
const b = 2 + false ? 3 : 0;

给我 a = 3b = 0。为什么 2 + 被忽略了?

试试这样写:

//如果想要的输出是a=5和b=2

const a = 2 + (true ? 3 : 0);
const b = 2 + (false ? 3 : 0;);

const bool = true;
const a = 2 + true ? 3 : 0;
const b = 2 + false ? 3 : 0;

console.log(a);
console.log(b);

https://jsfiddle.net/74ds0der/

您编写的代码给出 a = 3,b = 3。查看 jsfiddle link。

Why is the 2 + being ignored?

不是。鉴于:

2 + true ? 3 : 0;

首先评估2 + true。由于 2 是一个数,所以 + 被视为加法, true 被强制为数字 1,结果为 3。

然后 ? 导致 3 被强制转换为布尔值 true 所以 3:0 返回 3。

在第二个表达式中:

  • false 计算结果为 0
  • 2+0 的计算结果为 2
  • 2?计算结果为真,因此返回 3。

鉴于:

const b = 2 + false ? 3 : 0;

b 被赋值为 3.

与运算符优先级有关https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

正如您在 table 中看到的,加法 (+) 的优先级高于条件 (?)。它让编译器像这样读取它:

(2 + true) ? 3 : 0

2 + true 将首先评估。由于它是真值,因此结果将为 3。 如果要更改运算符优先级的默认行为,则需要添加括号:

2 + (true ? 3 : 0)