Подтвердить что ты не робот

Видимый Javascript для цикла

Я никогда не видел такой цикл JavaScript, как этот for( ; i-- ; ), используемый в коде:

uid: function (len) {
    var str = '';
    var src = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var src_len = src.length;
    var i = len;

    for (; i--;) {
        str += src.charAt(this.ran_no(0, src_len - 1));
    }

    return str;
}

Я понимаю поведение, но мне бы хотелось, чтобы кто-то мог поделиться некоторыми сведениями об этом типе цикла for.

4b9b3361

Ответ 1

Это синтаксис for-loop:

для ([инициализация]; [условие]; [окончательное выражение])
      оператор

В вашем случае for (; i--;) {:

  • никакие переменные не инициализируются, потому что var i = len; ранее инициализирован, поэтому он не нужен.
  • условие будет правдивым до тех пор, пока i не станет 0, тогда цикл завершится. i-- выполняется до каждой итерации, и из-за оператора -- он в конечном итоге станет 0, поэтому он ложный, и цикл остановится.
  • так как i уменьшается в условии части цикла, final-expression также не требуется. Другой способ выразить это: поскольку i не используется внутри цикла, не имеет значения, уменьшаем ли мы его до каждой итерации цикла или после каждой итерации цикла.

Говоря это, лучше избегать писать петли, как описано выше, так как это довольно запутанно и трудно читать. Предпочитают традиционную запись в виде петель.

Ответ 2

От MDN - для - необязательно для выражений:

Все три выражения в заголовке цикла for являются необязательными.

Вам не нужно указывать все три выражения в циклах for. Например, for (;;) является общей записью бесконечного цикла.

В вашем случае while(i--) сделал бы то же самое, нет никаких оснований писать for (; i--;).

Я также хотел бы отметить, что for(var i=len;i>=0;i--) более надежный - он защищает вас от случая len отрицательный.

Ответ 3

Это можно переписать в

uid: function (len) {
    var str = '';
    var src = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var src_len = src.length;
    var i = len;

    while (i >= 0) {
        str += src.charAt(this.ran_no(0, src_len - 1));
        i = i - 1;
    }

    return str;
}

Оператор for создает цикл, который состоит из трех необязательных выражения.

Javascript рассмотрит 0 == false, почему в представленном вами примере цикл будет работать до тех пор, пока переменная i не станет равна нулю. Он будет зацикливаться столько раз, сколько размер строки src.

Примечание: i-- использует значение переменной, а затем уменьшает его. Взгляните на следующую ситуацию:

for(;i--;) { // i = length in the condition
     // i === length - 1 here. It will not overflow the array
}

for(;i--;) { // i = 1
     // i === 0 here. It will be the last loop
}

for(;i--;) { // i == 0 == false
     // Not executed
}  

Ответ 4

Нет ничего плохого.

for(`INIT`;`TEST`;`ACTION`)
{
     `WORK`;
}

INIT (инициализация) может выполняться вне цикла.

var i=0;
for(;i<=100;i++)
//do something

Часть TEST дает результат, который равен либо true, либо false. Теперь в этом случае проверяется значение i. Пока он не станет равным нулю, это работает.

Часть ACTION обычно используется для изменения переменной цикла. Но вы также можете оставить его или добавить в раздел TEST, как это делается здесь.

Посмотрите эти примеры, чтобы очистить вашу идею.

var i=0;
for( i++; i++; i+=j); //No body

var i=0;
for(;;); //an infinite loop

var i;
for(i=-4;i;i++);//

Даже иногда WORK помещается в ACTION.

Пример:

факториал х

 for(var i=1,ans=1;i<=x;ans=ans*(i++));

Which can be written this way also-


 var ans=1;
for(var i=1;i<=x;i++)
   ans=ans*i;

ПРИМЕЧАНИЕ. Вы можете писать независимо от того, какой вы хотите. Это не имеет значения, если вы правильно написали код. Привыкайте к такой форме, вы увидите их много.

Хотя лучше писать иногда в компактной форме, но помните, что вы должны сохранять удобочитаемость.

Ответ 5

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

var i = len;
   ^^^
for (; i--;) {...

Таким образом, нет необходимости обновлять.

После первой точки с запятой существует условие для запуска цикла (т.е. i<6, i>3 и т.д.). Если условие возвращает false или 0, цикл завершается. В этом случае цикл будет разбит, если i - 0. Это происходит в конце концов, потому что -- после i уменьшает его, и поэтому нет необходимости в выражении, которое является местом после того, как вторая точка с запятой зарезервирована для.

Ответ 6

Первый параметр цикла for уже определен, поэтому начальная запятая должна разграничить его в списке параметров.