首页 > 解决方案 > 奇怪的使用 || 对于条件(三元)运算符是第二个选项的赋值

问题描述

在我的代码中发现了一个错误,如果 bar 未定义,我将在其中foo = bar || baz分配给 baz,但是当对第二个参数使用三元表达式时,JS 将为三元表达式分配真值,而不管第一个值如何。

打开控制台并测试它。似乎 JS 甚至不评估条件表达式,如此处所示,其中 b 未定义,但它仍然返回它的真值。

>>> a = 1 || 2
1
>>> a = 0 || 2
2
>>> a = 1 || b
1
>>> a = 1 || b ? 3 : 4
3
>>> b
ReferenceError: b is not defined[Learn More]
>>> a = 1 || ( b ? 3 : 4 )
1

我可以通过将三元表达式包装在 ()s 中来获得正确的结果,但是这里发生了什么?为什么它在上述测试用例中返回 3?

标签: javascriptsyntaxternary-operator

解决方案


||懒惰的- 它不会尝试评估左侧的 a||的右侧被确定为真。如果你做了b || 1而不是1 || b,它会先尝试评估b,然后会抛出一个错误:

const a = b || 1 ? 3 : 4

整个左侧?解释为条件。?(在评估整个条件之前,也会解析在a 左侧执行的其他操作?。)条件运算符具有最低的运算符优先级之一。

为了

1 || b ? 3 : 4

具有最高优先级的运算符是||, 为 5。因此,与 get 对面的两个表达式||首先评估“或”:

1 || b

由于 1 是真实的,因此整体1 || b评估为1不考虑b

1 ? 3 : 4

然后评估条件运算符(优先级 4):

true ? 3 : 4

评估为

3

因为条件为真。

当您在条件周围加上括号时:

1 || ( b ? 3 : 4 )

括号具有最高的运算符优先级,为 20 - 解释器知道括号内的所有内容都将计算为单个表达式,而不考虑括号外的内容。所以

1 || <something>

评估为

1

因为1是真实的。


推荐阅读