使用 || 的奇怪之处对于条件(三元)运算符是第二个选项的赋值

Oddity with using || for assignment where Conditional (ternary) operator is second option

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

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

>>> 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

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

||lazy - 它不会尝试评估左侧的 || 的右侧确定为说实话。如果您执行了 b || 1 而不是 1 || b,它会首先尝试计算 b,然后会抛出一个错误:

const a = b || 1 ? 3 : 4

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

为了

1 || b ? 3 : 4

具有最高优先级的运算符是 ||,在 5。因此 || 对面的两个表达式首先得到 "or" 的评估:

1 || b

因为 1 为真,所以整个 1 || b 的计算结果为 1,而不考虑 b

1 ? 3 : 4

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

true ? 3 : 4

评估为

3

因为条件成立。

当您在条件句两边加上括号时:

1 || ( b ? 3 : 4 )

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

1 || <something>

评估为

1

因为 1 是真实的。