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

Javascript while条件中的赋值表达式是一种不好的做法?,javascript,while-loop,assignment-operator,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]) { //

解释如果我使用这样的代码,为什么会出现警告:

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(element=element.parentNode)语法类似于或只是一种样式代码建议,但存在性能问题?


顺便说一下,«--i»操作符似乎也是一种不好的做法。一:

众所周知,++(递增)和--(递减)运算符通过鼓励过多的欺骗而导致错误代码


这是一个玩笑?

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

无论哪种方式,反对条件赋值的主要论点基本上是,大多数情况下,当你这样做时,这是一个错误(你的意思是
==
或在JS中,
==
)。一些代码检查器(和C#要求这是一种语言功能,以避免意外)如果您将赋值封装在一个附加的paren层中,即“是的,我真的是想赋值”(当您将赋值结果与其他值进行比较时,这也是必要的;省略paren会进行比较,然后赋值一个布尔值,这更可能是错误的)


有些人讨厌作为更大表达式一部分使用的递增/递减运算符,因为我想记住运算顺序很难,而且C程序员编写了一些可怕的东西,如
++*++var
等等。我忽略了这些人;只是不要将其用于过于棘手的事情。

作为一个例子正交法,以及可能的“更清洁/更清洁”方法:

// var htmlCollection = document.getElementsByClassName("class-name");
var htmlCollection = document.querySelectorAll('.class-name');
for(let htmlElement of htmlCollection) {
     htmlElement.classList.remove("class-name");
}
作为对DOM元素进行迭代的方法


更新后包含了下面ShadowRanger的建议。

此方法不会以相反的方式迭代?因此我不能在这种特殊情况下使用它,因为如果我删除
类名
,则该项将从Live htmlCollection中删除,下一项不是n+1而是n+2。可能
避免了这一点,但我不认为。@Haeresis:另一方面,切换到
document.querySelectorAll('.class name')
可以避免这种情况。是的,只是速度较慢(而且);p谢谢!有了这个ES6
而不是中的,就没有必要使用一些
hasOwnProperty
检查?@Haeresis:这个测试不是苹果对苹果的测试;你的
querySelectorAll
是基于子体执行额外的筛选;这需要花费时间,而且你没有弥补,因为你从来没有使用过结果ts(您可能需要手动执行子查询以获取
.internal div
子代)对于每个
。香草
查询selectorall
几乎肯定会赢得
getElementsByClassName
的支持,如果你对每个结果进行子查询,那么
getElementsByClassName
几乎肯定会赢。这就有理由指出你有«可能»的事实。用
=
而不是
=
做一个错误。但是大约是这样signent性能(不是前缀/后缀增量性能),也没有性能问题?@Haeresis:它可能存在的任何问题都可以忽略不计,或者通过在任何合理的现代JS引擎上重新排序编译器来消除。唯一有帮助的(profile!)是显式测试
while((htmlElement=htmlCollection[--i])!==未定义)
,这可能会为JS JIT er提供足够的信息,以将表达式优化为一个简单的指针比较,但同样,这是一个微优化,在JS开销的上下文中不太可能有意义。谢谢,这对我来说没关系。