JS: цикл по массиву (для ... в) - PullRequest
1 голос
/ 07 декабря 2010

Почему это так, когда я делаю

http://jsfiddle.net/xe4Ph/1/

var footnoteLinks = [1,2,3];
for (var i in footnoteLinks) {
   document.write(footnoteLinks[i] + ", ");
}

Что я получаю, это что-то вроде ...

1, 2, 3, function () {вернуться ниже; }, функция Array () {[собственный код]}, функция pop () {[собственный код]}, функция push () {[собственный код]}, функция reverse () {[собственный код]}, функция shift () {[собственный код]}, функция sort () {[собственный код]}, функция splice () {[собственный код]}, функция unshift ()

Почему это? Что с функциями и т.д ... Я думаю, что это работало нормально b4, я не знаю, что вызвало это сейчас, кажется, то же самое для всех браузеров, которые я пробовал. Firefox 3.6, Chrome 6 (я думаю?), IE9

Ответы [ 4 ]

6 голосов
/ 07 декабря 2010

for(var in obj) - для перебора свойств объекта.Вы получаете свойства созданного вами объекта Array.

Вам нужна более традиционная конструкция цикла / индексации:

for(var i=0,z=footnoteLinks.length; i<z; i++)

Некоторые среды выполнения JavaScript также имеют map и reduce методов для объектов Array, но это не гарантировано.Большинство библиотек JavaScript имеют что-то подобное (или, возможно, метод each), хотя.

1 голос
/ 07 декабря 2010

В JavaScript,

for (var k in {a:1, b:2}) {

не просто перебирает a и b; он также перебирает все члены прототипа этого объекта. Поскольку функции являются значениями в javascript, это включает в себя все методы Object. Есть три способа избежать этого:

  1. Проверьте, что obj.hasOwnProperty (k) перед использованием k
  2. Если вы перебираете массив, используйте метод массива forEach (или эквивалент в вашей любимой библиотеке javascript)
  3. Если вы перебираете массив, используйте конструкцию for (var i = 0; i
0 голосов
/ 07 декабря 2010

Альтернативой Weston C будет использование функции hasOwnProperty в цикле for in, как предлагает Крис Морган :

for(var i in obj) if(obj.hasOwnProperty(i)) {
  document.write(obj[i]);
}

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

0 голосов
/ 07 декабря 2010

Цикл for/in нельзя использовать для итерации по массиву, поскольку он также перечисляет пользовательские свойства (см. Документацию MDC ). Существует метод forEach для объектов массива и цикл for each/in, но только в JavaScript 1.6+ (в настоящее время это мало применимо). Возможно, вы захотите использовать некоторые из множества JavaScript-фреймворков или написать собственную утилиту для перебора массивов:

function iterate(a, func) {
    for (var i=0; i<a.length; i++)
        func(a[i]);
}

iterate([1, 2], function(x) { console.log(x) });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...