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