Есть ли веская причина избегать циклов FOR без финального выражения в JS? - PullRequest
4 голосов
/ 04 февраля 2012

Является ли плохой привычкой записывать обратные циклы как:

for (i = N; i--;)

, чтобы получить доступ (N-1) к 0

Если да, то почему?jsLint, конечно, не нравится.

Ответы [ 6 ]

6 голосов
/ 04 февраля 2012

Нет технической причины, по которой это не сработает. Тем не менее, он явно имеет проблемы с читабельностью, так как у кого-то сразу возникло «хорошо, что это не сработает!» реакция.

Это проблема, с которой команда jQuery борется с & ndash; использовать ли новые конструкции, которые сохраняют байты, за счет ясности и удобства обслуживания. Это действительно сводится к тому, стоит ли это 1 или 3 байта экономии:

for(var i=9;i--;)
var i=9;while(i--)
for(var i=9;i>0;i--)

В этом случае, вероятно, нет.

4 голосов
/ 04 февраля 2012

Считаете ли вы удобочитаемость? Вы можете очень хорошо это понять сами, но другие разработчики могут запутаться, так как части for "идиомы" обычно называют :

for ([initialization]; [condition]; [final-expression])

Хотя условно это может быть любое выражение, ваша версия не соответствует этой идиоме, поскольку используемая вами часть «условие» делает больше, чем просто определяет условие - она ​​также незаметно уменьшается i.

4 голосов
/ 04 февраля 2012

Это менее читабельно, без вашего объяснения мне потребуется несколько секунд, чтобы понять, что делает цикл. Почему бы просто:

while(i-- > 0)

2 голосов
/ 04 февраля 2012

"Это плохая привычка писать обратные циклы как:"

for (i = N; i--;)

Это вопрос мнения, но по сути это обратный while с инициализацией, поэтому, по моему мнению , это не "плохая привычка" . Это просто стиль кодирования.

Спецификация делает части for необязательными , чтобы предоставить разработчику такую ​​гибкость.

"jsLint определенно не нравится."

Кому интересно. Вы не обязаны следовать мнениям jsLint.

1 голос
/ 04 февраля 2012

Да. Есть веская причина. Читаемость.

1 голос
/ 04 февраля 2012

Ответы были бы очень субъективными, я думаю.Я не думаю, что это плохая привычка, но я нахожу это эстетически неприятным.Это можно выразить более изящно, как:

for (i = N - 1; i >= 0; i--) {
    // do something here.
}

// And if it is really important that i should be 0 here
// as it is in your original code.
i = 0

Этот код становится проще для нашего мозга при просмотре большого количества кода, который содержит это.

...