JavaScript для цикла с объектом вместо счетчика? - PullRequest
6 голосов
/ 17 сентября 2011

Глядя на этот фрагмент кода:

for (var i = 0, f; f = families[i]; i++) {
}

На самом деле я раньше не видел такой цикл, и хочу убедиться, что правильно его понимаю.если families.length == 2 что вторая часть строки for вернет false на f = families[2]?

Я бы подумал, что это должно быть что-то вроде f == families[2], чтобы вернуть false.

Ответы [ 2 ]

11 голосов
/ 17 сентября 2011

f = families[i] - это выражение, которое возвращает значение families[i]. (У этого также есть побочный эффект присвоения этого значения f)

Если families.length === 2, то families[2] === undefined, таким образом, выражение возвращает undefined, что ложно и прерывает цикл.

Для большего удовольствия от взлома вы можете включить

for (var i = 0, f; f = families[i]; i++) {
  // body
}

в

for (var i = 0, f; f = families[i++]; /* body */);

Возможно, вам придется заменить строку ; на ,, а строку заменить i на i-1. Вы также просто убили читабельность.

Следует также отметить, что цикл for глуп для удобства чтения.

Object.keys(families).forEach(function(key) {
  var family = families[key];
  /* body */
});

Значительно более читабелен.

0 голосов
/ 17 сентября 2011

Это похоже на глупый способ сделать

for(var i in families) {
    if (families.hasOwnProperty(i)) {
        // do whatever you want with families[i]
        console.log(families[i]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...