JavaScript для ... в ... возвращает hasObject? - PullRequest
1 голос
/ 25 ноября 2010

Это просто так.Я посмотрел в Интернете и посмотрел на StackOverflow, и я не вижу, чтобы кто-нибудь говорил об этом.

Это нормально, когда создается массив, например:

_e = Array();
_e[0] = 'admin_adv_from_date_month';
_e[1] = 'admin_adv_from_date_day';
_e[2] = 'admin_adv_from_date_year';
_e[3] = 'admin_adv_to_date_month';
_e[4] = 'admin_adv_to_date_day';
_e[5] = 'admin_adv_to_date_year';

Токогда вы проходите через это так:

enableElements : function(elements)
{
        for ( var e in elements )
        {
            hForm.enableElement(elements[e]);
        }
}

Последнее, что я установил - это hasObject в моем коде.Мне пришлось реализовать безопасную охрану в 'enableElement', так как e в этом случае возвращает null, поскольку 'hasObject' становится функцией:

enableElement : function(element)
    {
        var e = document.getElementById(element);
        if ( e )
        {
            e.disabled = false;
        }
    }

Я запускаю это на последнем Safari.Да, я знаю, что мог бы использовать всевозможные альтернативные браузеры, которые могут выполнять всевозможные уловки, но Safari - это то, что я использую для этого проекта.

Это нормальное поведение браузера?Почему это может произойти?

Ответы [ 4 ]

4 голосов
/ 25 ноября 2010

https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in

for...in

"Итерация указанной переменной по всем свойствам объекта, впроизвольный порядок. Для каждого отдельного свойства выполняется заданный оператор. "

" Хотя может быть заманчиво использовать это как способ перебора массива, это плохая идея. "

Не следует использовать for...in для перебора массивов, он предназначен для перебора свойств объекта.Вместо этого используйте старый добрый цикл for (var i = 0; i < arr.length; i++).

2 голосов
/ 25 ноября 2010

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

enableElements : function(elements)
{
    for (var i=0; i<elements.length; i++)
    {
        hForm.enableElement(elements[i]);
    }
}
2 голосов
/ 25 ноября 2010

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

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

0 голосов
/ 25 ноября 2010

используйте .length, а не for..in для массивов.

enableElements : function(elements) {
    for (var i=0, l = elements.length; i<l; i++)
    {
        hForm.enableElement(elements[i]);
    }

В противном случае вы рискуете перечислить что-либо через Object.prototype. Вы можете .hasOwnProperty проверить, но зачем это делать, когда .length идеально?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...