JavaScript: Определение наличия метода или свойства в объекте

2011-01-31

В языке JavaScript существует специальный оператор «in» для определения наличия методов или свойств в объекте или проверки наличия определенных индексов в массиве.

Возвращается значение true если свойство или метод присутствует, иначе — false.

Пример использования:

// проверим наличие метода "querySelectorAll" в объекте "document"
if("querySelectorAll" in document) {
// значит метод есть, и мы можем его использовать
//...
}

Конечно, можно было бы написать иначе, и казалось бы, проще:

// проверим наличие метода "querySelectorAll" в объекте "document"
if(document.querySelectorAll) {
// значит метод есть, и мы можем его использовать
//...
}

… но, обычно, такой подход дает значительную потерю производительности, если он используется очень часто (к примеру — зациклен).
Дело в том, что при подобном подходе, мы каждый раз либо запускаем на выполнение некоторые вычислительные процессы (пример: myArray.length), либо возвращаем большие фрагменты данных в никуда, только ради того, чтобы проверить наличие свойства или метода.

Поэтому, для подобных целей настоятельно рекомендуется использовать оператор «in».



2 комментария на «JavaScript: Определение наличия метода или свойства в объекте»

  1. Даник:

    Замерил в Chrome и в Firefox, результаты прямо противоположные. Проверка через in процентов на 10-20 медленней.

  2. ManiaC:

    написал функцию с проверкой
    function tests(arg_)
    {
    if(arg.body)
    return true;
    else
    return false;
    };

    вызываю в цикле
    var res=false;
    for(var i=0;i<1000000;i++)
    {
    if (test(document)) res=true;
    }
    время: Лиса 5400мс, опера 2100мс, Reconq (web-kit) 540мс.

    Пишу var doc=document; и в цикле вызываю test(doc);
    время: Лиса 100мс, опера 2800мс, Reconq 45мс.

    занятные результаты получились. А вот разницы между ('body' in document) и (document.body) и (typeof document.body!=='undefined') практически никакой во всех браузерах. первый способ процентов на 5-10 быстрее, последний — на 5-10 медленней медленней второго. При этом разброс замеров для одного и того-же метода около 5%.

Добавить комментарий