在条件中分配表达是一种不好的做法?

Bru*_*eur 2 javascript while-loop assignment-operator

这篇文章解释了为什么我使用这样的代码时会发出警告:

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");
}
Run Code Online (Sandbox Code Playgroud)

但这并没有解释为什么在一段时间内分配表达式是一种不好的做法?».

我也读过这个stackoverflow的答案,指出这种做法是好的.所以...

while (element = element.parentNode)类似语法的性能问题还是样式代码推荐?


顺便说一句,似乎«--i»运算符也是一种不好的做法.我在这篇文章中读到:

已知++(递增)和 - (递减)运算符通过鼓励过多的诡计来导致错误的代码.

这是某种玩笑?

Sha*_*ger 5

不应该有任何性能问题,它(可以说,前缀增量索引可以比后缀增量稍慢,由于与CPU管道的问题,这是一个microoptimization如此可笑的微它几乎肯定意味着什么在JS引擎开销的情况下即使在C语言中,编译器也可能重新排序表达式,如果它可以确保它不会停止等待增量).

无论哪种方式,在条件中反对赋值的主要论据基本上是在你执行它的大部分时间,这是一个错误(你的意思==或在JS中===).一些码检验(和C#要求这是一个语言功能,以避免事故)是满意的,如果你包分配中括号的附加层,说:"是啊,我真正的意思分配"(这也是必要的,当你"重新比较赋值的结果与其他一些值;省略parens而不是比较,然后分配一个布尔值,这更可能是错误的).

有些人讨厌增量/减量运算符用作较大表达式的一部分,因为记住操作的顺序我很难,并且因为已知C程序员编写类似++*++var的类似的东西.我无视这些人; 只是不要用它来做过于棘手的事情.