как работает этот синтаксис? - PullRequest
0 голосов
/ 09 октября 2011
erase: function(item){
        for (var i = this.length; i--;) {
            if (this[i] === item) this.splice(i, 1);
        }
        return this;
    }

Как будет работать эта (var i = this.length; i--;) синтаксическая конструкция?

Должно быть три раздела? Что это в этом случае?

из здесь .

Ответы [ 3 ]

5 голосов
/ 09 октября 2011
Цикл

A for в C-подобных языках состоит из трех частей:

for ( инициализатор ; условие ; update ) { ... }

Цикл затем преобразуется в следующий (примерно) эквивалентный цикл (здесь есть различия, но они не имеют отношения):

инициализатор ;
while ( условие ) {
...
обновление ;
}

Итак, инициализатор запускается первым;затем цикл выполняется до тех пор, пока условие остается верным, и в конце каждой итерации выполняется часть update .Это не должно быть приращением, но наиболее распространенная форма выглядит следующим образом:

for (var i = 0; i < something; i++) { ... }

Но вы можете записать все, что вы хотите в эти части, и вы также можете оставить их пустыми, если вы делаете вцикла достаточно для правильной работы и завершения цикла.Так что в вашем случае, поскольку i-- является выражением, которое также обновляет i, цикл просто объединяет оба условие и update в одно и ведет обратный отсчет.

3 голосов
/ 09 октября 2011

Инициализирует i до this.length и использует проверку условия, чтобы также уменьшить ее.Когда он достигает нуля, что является ложным значением, цикл останавливается.

Но учтите, что поскольку вы уменьшаете чек, цикл начинается с this.length - 1 и заканчивается на 0.Так что это эквивалентно:

(var i = this.length - 1; i >= 0; i--)

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

2 голосов
/ 09 октября 2011

В какой-то момент i достигнет 0, что является ложным значением, и это завершает цикл.

Более конкретно, после нескольких итераций:

  • Он проверит i и получит 1
  • i будет уменьшено и станет 0
  • Цикл будет работать с i == 0
  • Он проверит i и получит 0
  • i будет уменьшено и станет -1
  • Цикл закончится
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...