Обертывание циклов For in с операторами if в цикле Javascript по массивам

JSLint продолжает жаловаться на подобные вещи

var myArray = [1, 2, 3];
for (var value in myArray)
{
   // BLAH
}

Сказав, что я должен обернуть это в оператор if. Я понимаю, что вам нужно обернуть его, если вы перебираете свойства объекта, но вот что я должен добавить в оператор if, чтобы выполнить правильную фильтрацию.

Кроме того, когда я делаю что-то вроде

for (var i = 0; i < 10; i++)
{
   // foo
}

for (var i =0; i < 20; i++)
{
   // bar
}

Он жалуется, что я уже определен. Как предотвратить это, кроме использования разных имен переменных?


person DevDevDev    schedule 26.10.2009    source источник


Ответы (4)


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

Это потому, что вы получите не только числовые ключи, но и любые другие произвольные свойства, которые были добавлены к массиву или его Array.prototype. Последнее обычно исходит из служебных функций расширения, добавленных фреймворками.

Хотя вы можете обойти этот случай с помощью hasOwnProperty, чтобы убедиться, что это не член-прототип, это уродливее, чем просто делать это правильно с for (var i= 0...), так зачем беспокоиться.

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

Он жалуется, что я уже определен. Как предотвратить это, кроме использования разных имен переменных?

Да, вы можете игнорировать это.

Он хочет, чтобы вы удалили var из второго for (i..., потому что объявление переменной дважды в одной и той же области ничего не делает. Однако я бы порекомендовал оставить var там, потому что это не наносит никакого вреда, и если вы переместите цикл в другой блок, вы не хотите, чтобы он внезапно начал строчить глобальные переменные.

person bobince    schedule 26.10.2009

Действительно, вам не нужно слушать jslint. Но если вы действительно хотите просто пройти (что приятно), вы можете сделать:

var myArray = [1, 2, 3];
for (var value in myArray)
{
  if (myArray.hasOwnProperty(value)) {
    // BLAH
  }
}

Во второй части вы должны либо поместить их в функции, либо использовать другие переменные. Другим решением было бы просто использовать i вместо var i во второй раз, потому что он уже определен...

person Alex Sexton    schedule 26.10.2009

Если вы посмотрите документы JSLint, вы найдете ссылку, объясняющую Логическое обоснование фильтрации циклов for-in: в основном это делается для того, чтобы не спотыкаться о любые перечисляемые свойства, которые были добавлены к прототипу объекта. (Хотя вы все равно не должны использовать for-in для перебора массива.)

Во втором случае вы объявляете переменную дважды: переменные имеют область видимости функции (или глобальную область видимости) в JavaScript. Дуглас Крокфорд, а значит, и JSLint, утверждает, что лучше объявить переменную только один раз для той области видимости, в которой она находится:

var i;

for (i = 0; i < 10; i++)
{
   // foo
}

for (i =0; i < 20; i++)
{
   // bar
}
person NickFitz    schedule 26.10.2009

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

В любом случае лучший способ выполнить итерацию по массиву — использовать цикл for, а не цикл for in.

Если вам нужно подробное объяснение, прочитайте этот сообщение.

person sebarmeli    schedule 06.12.2010