Вопрос: Javascript цикл «do-while»


Я работаю с некоторым JS-кодом, который я унаследовал в проекте, и в нескольких случаях он имеет следующие петли:

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

Я предполагаю, что это достижение какой-то функциональности типа do-while. Однако, когда я запускаю это через JSLINT, он жалуется, что он «ожидает условное выражение и вместо этого видит назначение».

Есть ли более приемлемый подход, который я должен использовать для этих циклов? Я не уверен, что лучший способ или нет:

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

4


источник


Ответы:


Существует ли более приемлемый подход

Не принимайте совет JSLint как Евангелие. Это догматическое мнение от капризного старика; некоторые из них вполне разумны, некоторые из них довольно сомнительны.

while (variable= assignment), хотя иногда это может быть ошибочным компаратором, также является широко понятной идиомой C-подобных языков. Используете ли вы тот или иной подход, это вопрос вкуса, то, что вы должны взвесить лично, а не слепо принять указ Крокфорда.

JavaScript делает  есть цикл do-while, поэтому, если ваш тест будет последовательно в конце, который будет более подходящей конструкцией:

do {
    text= someBufferObject.read();
    // do something
} while (text);

Чаще всего то, что вы смотрите, представляет собой цикл среднего теста. Вы можете или не можете предпочесть break Идиома, используемая Python:

while (true) {
    text= someBufferObject.read();
    if (!text)
        break;
    // do something
}

11



Вам нужно только обернуть его в другой набор круглых скобок, чтобы сделать JSLint счастливым.

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

11



Я могу только представить, что это проблема с JSLINT, это полностью действующий javascript, в любом случае это намного лучше, чем второе решение.


2



Посмотрите, жалуется ли JSLINT об этом:

while (NULL! = (text = someBufferObject.read ())) {
  // Делаем материал с текстом
} 

2



Ни один из примеров - это «делать-пока», они просто разные стили кода, которые по сути делают то же самое. JSLint просто информирует вас о том, что первый стиль идет вразрез с лучшими практиками.


1



JSLint жалуется, потому что это запах кода JavaScript - использование одноразового (оператор присваивания) вместо двойных или тройных равных (оператор равенства / идентичности) является распространенной ошибкой.

Если ваш код работает, не потейте предупреждение. Это автоматизированный инструмент, а не всезнающий инструмент.


1



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

также принимается jsLint и стиль менее критический, чем обходной путь paranthese: while ((a = b)) {...}


0



Javascript цикл «do-while» | Programmerz.ru