while 条件中的赋值表达式是一种不好的做法?

Assignment expression in while condition is a bad practice?

This article 解释了为什么我使用这样的代码时会收到警告:

var htmlCollection = document.getElementsByClassName("class-name"),
    i = htmlCollection.length,
    htmlElement;

// Because htmlCollection is Live, we use a reverse iteration.
while (htmlElement = htmlCollection[--i]) { // **Warning?! Why?!**
    htmlElement.classList.remove("class-name");
}

但这并没有解释 « 为什么在 while 条件下赋值表达式是一种不好的做法? ».

我也看了这篇Whosebug answers,觉得这个做法一样好。所以...

while (element = element.parentNode) 类语法存在性能问题,或者仅仅是样式代码建议?


顺便说一下,« --i » 运算符似乎也是一种不好的做法。我 read in this article :

The ++ (increment) and -- (decrement) operators have been known to contribute to bad code by encouraging excessive trickiness.

这是什么玩笑?

它应该没有性能问题(可以说,由于 CPU 管道的问题,使用前缀递增的索引可能比后缀递增的索引稍慢;这是一个非常微不足道的微优化,几乎可以肯定在 JS 引擎开销的上下文中没有任何意义,即使在 C 中,编译器也可能会重新排序表达式,以确保它不会因等待增量而停止。

无论哪种方式,在条件中反对赋值的主要论点基本上是 大多数 你这样做的时候,这是一个错误(你的意思是 == 或在 JS 中,===)。如果您将赋值包裹在额外的括号层中,例如 "Yup, I really meant to assign" (在比较结果时这也是必要的),一些代码检查器(并且 C# 要求将此作为语言功能以避免事故)会得到满足分配给其他一些值;省略括号会比较,然后分配一个布尔值,这更可能是错误的)。

有些人讨厌 increment/decrement 运算符用作较大表达式的一部分,因为我猜是因为很难记住运算顺序,而且因为众所周知 C 程序员会写出像 [=12 这样可怕的东西=] 之类的。我不理会这些人;只是不要将它用于过于棘手的事情。

作为正交方法,可能 'cleaner/clearer' 有:

// var htmlCollection = document.getElementsByClassName("class-name");
var htmlCollection = document.querySelectorAll('.class-name');
for(let htmlElement of htmlCollection) {
     htmlElement.classList.remove("class-name");
}

作为迭代 DOM 个元素的方法。

已更新以包含下面来自 ShadowRanger 的建议。