三元运算符的赋值忽略剩余的表达式
Assignment from ternary operator ignores remaining expression
这样做
const bool = true;
const a = 2 + true ? 3 : 0;
const b = 2 + false ? 3 : 0;
给我 a = 3
和 b = 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)
这样做
const bool = true;
const a = 2 + true ? 3 : 0;
const b = 2 + false ? 3 : 0;
给我 a = 3
和 b = 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)