在某些情况下,将赋值用作条件是有意义的。这需要在可读性方面进行权衡,因此有一些特定的风格建议,可以使模式对每个人都更加明显。
考虑下面的示例,该示例遍历文档的注释,并将其记录到控制台。
常数迭代器=文件.创建节点标识符(文件,节点筛选器.显示_结算);
让当前节点;
虽然 (当前节点=迭代器.next节点()) {慰问.日志(当前节点.text内容.修剪());
}
这并不完全是一个好的实践示例,具体原因如下:
这个影响该行中的注释节点很好,即每次找到注释节点时:
迭代器.nextNode()
返回该注释节点,该节点被分配给当前节点
.
- 的价值
currentNode=迭代器.nextNode()
因此是真实的.
- 所以
控制台.log()
调用执行,循环继续。
…然后,当文档中没有更多注释节点时:
迭代器.nextNode()
收益无效的
.
- 的价值
currentNode=迭代器.nextNode()
因此也是无效的
,这是虚伪的.
- 所以循环结束了。
该行的问题是:通常使用的条件比较运算符例如===
,但是=
该行中不是比较运算符,而是一个赋值运算符.所以=
看起来像这是一个拼写错误===
-即使它是不实际上是打字错误。
因此,在这种情况下代码行工具例如ESLint不同意的设计
规则-为了帮助您捕获可能的输入错误,以便您可以修复它-将报告如下警告:
应为条件表达式,但看到了赋值。
许多样式指南建议更明确地指示条件作为赋值的意图。您可以通过将附加括号作为分组运算符围绕作业:
常数迭代器=文件.创建节点标识符(文件,节点筛选器.显示_结算);
让当前节点;
虽然 ((当前节点=迭代器.next节点())) {慰问.日志(当前节点.text内容.修剪());
}
事实上,这是ESLint的风格不同意的设计
的默认配置,以及更漂亮,所以您可能会在野外经常看到这种模式。
有些人可能会进一步建议添加比较运算符,将条件转换为显式比较:
虽然 ((当前节点=迭代器.next节点()) !== 无效的) {
有其他方法可以编写此模式,例如:
虽然 ((当前节点=迭代器.next节点()) &&当前节点) {
或者,放弃使用虽然
循环总计:
常数迭代器=文件.创建节点标识符(文件,节点筛选器.显示_结算);
对于 (
让当前节点=迭代器.next节点();当前节点;当前节点=迭代器.next节点()
) {慰问.日志(当前节点.text内容.修剪());
}
如果读者足够熟悉作为条件模式的赋值,那么所有这些变体都应该具有同等的可读性。否则,最后一个表单可能是最可读的,尽管最冗长。