有人可以解释为什么
result
在这个语句中评估为 20
吗?
let result = 10 ?? true ? 20 : 30;
鉴于空值合并以从左到右的方式评估语句,并且比三元运算符具有更高的优先级,为什么不假设
result
应该是 10
是安全的?
注意:如果添加分组运算符,则
result
为 10
。
let result = 10 ?? (true ? 20 : 30);
据我了解,空合并运算符(??)比条件(三元)运算符具有更高的运算符存在度,因此它应该首先执行。
(文档说
??
运算符的运算符优先级分数为5,而... ? ... : ...
的分数为4。)
那么
let result = 10 ?? true ? 20 : 30;
基本上评估为
let result = (10 ?? true) ? 20 : 30; // => 10 ? 20 : 30
鉴于 10 是一个 truthy 值,它 (
10 ? 20 : 30
) 的计算结果为 20
您可能会注意到,JavaScript 运算符存在表中有一个“关联性” 列。
您可能想知道它是否在这种情况下发挥作用。但答案似乎是“并非如此”。以下引用(来自文档)中对此进行了说明:
当存在多个具有相同优先级的运算符时,来源关联性的差异就会发挥作用。
a ?? false ? 'foo' : 'bar'
如果
a
为真,则选择
a
,并且显然返回'foo'
。如果
a
null, undefined
,则选择 false
,并返回 'bar'
。如果
a
'', 0, false
,则选择 a
。然而,从三元的角度来看,a
仍然是假的,因此返回'bar'
。如果您想对条件语句进行空检查,请改用:
a != null ? 'foo' : 'bar' // a is not null or undefined
!a && a != null ? 'bar' : 'foo' // a is not '', 0, or false. Does anyone really use this one?