В языке JavaScript существует специальный оператор «in» для определения наличия методов или свойств в объекте или проверки наличия определенных индексов в массиве.
Возвращается значение true если свойство или метод присутствует, иначе — false.
Пример использования:
// проверим наличие метода "querySelectorAll" в объекте "document"
if("querySelectorAll" in document) {
// значит метод есть, и мы можем его использовать
//...
}
Конечно, можно было бы написать иначе, и казалось бы, проще:
// проверим наличие метода "querySelectorAll" в объекте "document"
if(document.querySelectorAll) {
// значит метод есть, и мы можем его использовать
//...
}
… но, обычно, такой подход дает значительную потерю производительности, если он используется очень часто (к примеру — зациклен).
Дело в том, что при подобном подходе, мы каждый раз либо запускаем на выполнение некоторые вычислительные процессы (пример: myArray.length), либо возвращаем большие фрагменты данных в никуда, только ради того, чтобы проверить наличие свойства или метода.
Поэтому, для подобных целей настоятельно рекомендуется использовать оператор «in».
Замерил в Chrome и в Firefox, результаты прямо противоположные. Проверка через in процентов на 10-20 медленней.
написал функцию с проверкой
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%.