В JavaScript есть несколько способов проверить, удовлетворяет ли строка заданному шаблону:
// 1. Объявляем объект в виде регулярного выражения var RegExp = '/script/gi'; // и ищем в элементе массива совпадение с заданным шаблоном items[i].nodeName.search(RegExp); // 2. можно просто проверять соответствие строке, // а не искать индекс подстроки items[i].nodeName.match(RegExp); // 3. Можно обойтись без объявления самого регулярного выражения items[i].nodeName.match(/script/gi); // 4. Можно задавать регулярное выражение без глобального модификатора, // ведь мы ищем любое (=первое) совпадение шаблона items[i].nodeName.match(/script/i); // 5. С тем же успехом мы можем выполнить шаблон script/i.exec(items[i].nodeName); // 6. Наконец, можно протестировать сам шаблон на нахождение в строке script/i.test(items[i].nodeName);
Давайте рассмотрим, что из них работает быстрее всего. Для этого запустим немного модифицированный набор тестов из раздела выше (опять по 10000 раз для всего DOM-дерева). Получим следующие результаты:
Браузер | search | match | «На лету» | Локальный | exec | test |
---|---|---|---|---|---|---|
Firefox 3.0.3 | 2120 | 2041 | 1295 | 1273 | 1225 | 1348 |
Safari 3.1.2 | 453 | 469 | 344 | 359 | 360 | 359 |
Opera 9.61 | 2141 | 2063 | 406 | 344 | 312 | 313 |
IE 6 | 2594 | 2516 | 1875 | 1859 | 1953 | 1906 |
IE 7 | 2562 | 2469 | 1859 | 1844 | 2000 | 1860 |
IE 8b2 | 2140 | 2032 | 1453 | 1453 | 1547 | 1469 |
Chrome 0.2 | 856 | 870 | 416 | 397 | 385 | 392 |
Таблица 7.4. Различные варианты выполнения регулярного выражения, результаты в миллисекундах
Как мы видим, в данном случае создание нового регулярного выражения — весьма ресурсоемкий процесс, поэтому в большинстве случаев лучше обходиться без него. В остальном все браузеры ведут себя достаточно ровно при сопоставлении match
, exec
и test
.