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开销的上下文中不太可能有意义。谢谢,这对我来说没关系。