使用 || 的奇怪之处对于条件(三元)运算符是第二个选项的赋值
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 是真实的。
在我的代码中发现了一个错误,如果 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 是真实的。