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:
已知++(递增)和 - (递减)运算符会通过鼓励过多的诡计来导致错误的代码。
这是某种玩笑?
答案 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的建议。