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

时间:2016-01-06 13:34:38

标签: javascript while-loop assignment-operator

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");
}

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

我也读到了这个stackoverflow answers这个做法很好。所以......

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

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

  

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

这是某种玩笑?

2 个答案:

答案 0 :(得分:5)

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

无论哪种方式,在条件中反对赋值的主要论据基本上是大多数当你这样做时,这是一个错误(你的意思是==或者是JS,{{ 1}})。一些代码检查器(以及C#需要这种语言功能以避免发生意外)如果你将一项任务包装在一个额外的parens中,就会说“Yup,我真的想分配”(当你'时也是必要的)重新比较赋值的结果与其他一些值;省略parens代替比较,然后分配一个布尔值,这更可能是错误的。)

有些人讨厌使用增量/减量运算符作为较大表达式的一部分,因为记住操作的顺序很难,我猜,因为已经知道C程序员会编写像===这样的可怕事情。喜欢。我无视这些人;只是不要将它用于过于棘手的事情。

答案 1 :(得分:0)

作为一种正交方法,并且可能更清洁/更清晰'有:

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

作为迭代DOM元素的方法。

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