Как опознать RegExp.
Что-то затишье на форуме, нужно подразбавить.
Вопрос: Как в JavaScript опознать объект типа RegExp? Т.е. нужна функция isRegExp. Я знаю только один надежный вариант, может узнаю еще парочку :) |
alert(Object.prototype.toString.call(/./) == "[object RegExp]"); |
1. instanceof
2. constructor 3. наличие методов которые есть только у RegExp |
Цитата:
var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; Видно просто !!window.opera уже не модно. |
Octane,
ну хоть бы дал подумать :) Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
function isArray(obj) { return Object.prototype.toString.call(obj) == '[object Array]'; } Это не обмануть. |
Цитата:
function isArray(obj) { return Object.prototype.toString.call(obj) == '[object Array]'; } Object.prototype.toString = function() {return ''}; var a = []; alert(isArray(a)); |
Поправлюсь: не обмануть псевдо-массивом. А после финта
Цитата:
|
Цитата:
Цитата:
|
А вы уверены, что Object.prototype.toString не используется нигде в нативных объектах/функциях? Просто таким финтом вы не обманули какую-то конкретную функцию, а потенциально сломали все. Сломать и обмануть -- разные вещи. Проще было написать
var isArray = function() { return false; }; |
Цитата:
|
Цитата:
|
Riim, твой пример равносилен следующему:
Object = null; alert(Object); Все в пределах разумного же должно быть. Вот пример c opera, ведь никто не застрахован от того, что его скрипт не подключется после того, как в глобальном пространстве имен будет создана переменная opera? А если еще вспомнить, что IE добавляет глобальные ссылки на DOM-элементы по именам идентификаторов… Цитата:
|
Цитата:
|
Dmitry A. Soshnikov,
я ж специально не isArray выбрал :). На regexp'ы в фреймворках проверки обычно нет. Так что тут задача была скорее в проведении аналогии. С чем, к сожалению, у многих проблемы. |
Я так и не понял, почему заменять методы в prototype конструкторов - плохо. Вроде это стандартная практика.
|
Kolyaj, да какая разница "Array" или "RegExp"; по стандарту, host-объекты могут иметь в качестве [[Class]] любое значение, включая, используемые стандартными объектами ECMA (я, кстати, подправил коммент, где "Array" написал).
|
Цитата:
|
Цитата:
|
Dmitry A. Soshnikov,
я прекрасно знаю, что для тебя это все очевидно, задача-то и не для тебя была :) Цитата:
|
Цитата:
Все же я не понимаю, чем instanceof не устраивает? Да есть некоторые моменты, которые нужно принимать во внимание, но если их знать, то все отлично работает. К тому же это самый быстрый способ (в 99.9% случаев за исключением как раз тех самых моментов) и самое главное: он не заставляет брать на себя какие либо обязательства. |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 13:10. |