我正在处理一些我在项目中继承的JS代码,并且在几个实例中它设置了像这样的循环:
while(text = someBufferObject.read()) {
//do stuff with text
}
我假设这是为了实现某种do-while类型功能。但是,当我通过JSLINT运行它时,它会抱怨它“预期一个条件表达式,而是看到一个赋值。”
我应该为这些循环使用更接受的方法吗?我不确定下面的内容是否是最好的方式:
text = someBufferObject.read()
while(text) {
//do stuff with text
text = someBufferObject.read()
}
答案 0 :(得分:11)
是否有更受欢迎的方法
不要将JSLint的建议视为福音。这是一个胡思乱想的老人的教条意见;其中一些是完全合情合理的,有些可疑。
while (variable= assignment)
虽然它有时可能是一个错误的比较器,但也是一种广泛理解的类C语言的习语。无论你使用这种方法还是其他方法都是一种品味问题,你应该亲自权衡,而不是盲目地接受克罗克福德的法令。
JavaScript 确实有一个do-while循环,所以如果你的测试一直在最后,那么这将是一个更合适的结构:
do {
text= someBufferObject.read();
// do something
} while (text);
更常见的是,你所看到的是一个中等测试循环。您可能喜欢或不喜欢Python使用的break
习语:
while (true) {
text= someBufferObject.read();
if (!text)
break;
// do something
}
答案 1 :(得分:11)
您只需将其包装在另一组括号中,以使JSLint满意。
while((text = someBufferObject.read())) {
//do stuff with text
}
答案 2 :(得分:2)
我只能想象这是JSLINT的问题,这是完全有效的javascript,它比第二个解决方案要好得多。
答案 3 :(得分:2)
看看JSLINT是否抱怨这个:
while (NULL != (text = someBufferObject.read())) { //do stuff with text }
答案 4 :(得分:1)
这两个例子都不是“do-while”,它们只是不同的代码风格,基本上做同样的事情。 JSLint只是告诉你第一种风格违背了最佳做法。
答案 5 :(得分:1)
JSLint抱怨,因为它是一个JavaScript代码 - 气味 - 使用单等号(赋值运算符)而不是double或tripe-equals(相等/身份运算符)是一个常见的错误。
如果您的代码有效,请不要发出警告。它是一种自动化工具,而不是一种无所不知的工具。
答案 6 :(得分:0)
while((text = someBufferObject.read()) !== undefined) {
//do stuff with text
}
esLint也接受,并且比括号变通方法更加隐秘的样式: 而((a = b)){...}