javascript - 奇怪的使用 || 对于条件(三元)运算符是第二个选项的赋值
问题描述
在我的代码中发现了一个错误,如果 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?
解决方案
||
是懒惰的- 它不会尝试评估左侧的 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是真实的。
推荐阅读
- git - SSH GITHUB 密钥
- ruby-on-rails - 使用 khttp 的 Kotlin http 请求
- uwp - UWP:如何设置我的 ListBoxItem 的样式并添加一些触发器
- indexing - How to index events in patterns with Esper EPL (CEP)
- php - Laravel Route 突然重定向到/没有到达 Controller
- android - 我如何在 Google Play 上看到描述图片?
- jhipster - JHipster:.yo-rc.json 文件是否有参考文档?
- spring-boot - WildFly 14:org.apache.tomcat.websocket.server.WsServerContainer 类无法转换为 io.undertow.websockets.jsr.ServerWebSocketContainer 类
- android - 如何在 Android 8.1 及更高版本中更改默认通知
- mediawiki - 如何让 MediaWiki 搜索忽略重音符号?