Javascript“do-while”类型循环

时间:2009-11-13 02:49:56

标签: javascript

我正在处理一些我在项目中继承的JS代码,并且在几个实例中它设置了像这样的循环:

while(text = someBufferObject.read()) {
  //do stuff with text
}

我假设这是为了实现某种do-while类型功能。但是,当我通过JSLINT运行它时,它会抱怨它“预期一个条件表达式,而是看到一个赋值。”

我应该为这些循环使用更接受的方法吗?我不确定下面的内容是否是最好的方式:

text = someBufferObject.read()
while(text) {
  //do stuff with text
  text = someBufferObject.read()
}

7 个答案:

答案 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)){...}