空合并和三元的运算符优先级

问题描述 投票:0回答:4

有人可以解释为什么

result
在这个语句中评估为
20
吗?

let result = 10 ?? true ? 20 : 30;

鉴于空值合并以从左到右的方式评估语句,并且比三元运算符具有更高的优先级,为什么不假设

result
应该是
10
是安全的?

注意:如果添加分组运算符,则

result
10

let result = 10 ?? (true ? 20 : 30);
javascript operators
4个回答
11
投票

据我了解,空合并运算符(??)条件(三元)运算符具有更高的运算符存在度,因此它应该首先执行。

文档

??
运算符的运算符优先级分数为5,而
... ? ... : ...
的分数为4。)

那么

let result = 10 ?? true ? 20 : 30;

基本上评估为

let result = (10 ?? true) ? 20 : 30; // => 10 ? 20 : 30

鉴于 10 是一个 truthy 值,它 (

10 ? 20 : 30
) 的计算结果为 20

额外细节

您可能会注意到,JavaScript 运算符存在表中有一个“关联性” 列。

您可能想知道它是否在这种情况下发挥作用。但答案似乎是“并非如此”。以下引用(来自文档)中对此进行了说明:

当存在多个具有相同优先级的运算符
时,

关联性的差异就会发挥作用。

来源


0
投票


0
投票

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?



0
投票

© www.soinside.com 2019 - 2024. All rights reserved.