Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.07.2009, 14:06
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Как опознать RegExp.
Что-то затишье на форуме, нужно подразбавить.

Вопрос: Как в JavaScript опознать объект типа RegExp? Т.е. нужна функция isRegExp.

Я знаю только один надежный вариант, может узнаю еще парочку
Ответить с цитированием
  #2 (permalink)  
Старый 03.07.2009, 14:17
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

alert(Object.prototype.toString.call(/./) == "[object RegExp]");
Ответить с цитированием
  #3 (permalink)  
Старый 03.07.2009, 14:17
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

1. instanceof
2. constructor
3. наличие методов которые есть только у RegExp
Ответить с цитированием
  #4 (permalink)  
Старый 03.07.2009, 14:20
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Octane
alert(Object.prototype.toString.call(/./) == "[object RegExp]");
Последняя версия PrototypeJs таким же способом определяет оперу:
var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';


Видно просто !!window.opera уже не модно.
Ответить с цитированием
  #5 (permalink)  
Старый 03.07.2009, 14:27
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Octane,
ну хоть бы дал подумать

Сообщение от Riim
1. instanceof
2. constructor
3. наличие методов которые есть только у RegExp
Все плохо и не во всех случаях работает.

Сообщение от Riim
Видно просто !!window.opera уже не модно.
!!window.opera не защищено от var opera = true;
Ответить с цитированием
  #6 (permalink)  
Старый 03.07.2009, 14:36
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Kolyaj
Все плохо и не во всех случаях работает.
Сообщение от Kolyaj
!!window.opera не защищено от var opera = true;
Я где то читал обсуждение правильного способа определения массива. Так там, в конечном счете, лучшим признали вариант, состоящий примерно из !50! строк кода (представьте, если какой-нибудь, PrototypeJs например, так написать). Каких только проверок на дурака там не было (в конечном счете, все равно можно было обмануть). И оно надо? Если я точно знаю все минусы instanceof, то почему мне его не применять там, где эти минусы не проявляются?

Последний раз редактировалось Riim, 03.07.2009 в 15:00.
Ответить с цитированием
  #7 (permalink)  
Старый 03.07.2009, 14:46
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Riim
в конечном счете, все равно можно было обмануть
function isArray(obj) {
    return Object.prototype.toString.call(obj) == '[object Array]';
}

Это не обмануть.
Ответить с цитированием
  #8 (permalink)  
Старый 03.07.2009, 14:49
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Kolyaj
Это не обмануть.
Легко:
function isArray(obj) {
    return Object.prototype.toString.call(obj) == '[object Array]';
}
Object.prototype.toString = function() {return ''};
var a = [];
alert(isArray(a));
Ответить с цитированием
  #9 (permalink)  
Старый 03.07.2009, 15:05
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Поправлюсь: не обмануть псевдо-массивом. А после финта
Сообщение от Riim
Object.prototype.toString = function() {return ''};
что угодно может сломаться в самых неожиданных местах.
Ответить с цитированием
  #10 (permalink)  
Старый 03.07.2009, 15:36
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Kolyaj
А после финта
Сообщение от Kolyaj
что угодно может сломаться в самых неожиданных местах.
Только в том случае если Object#toString применять для подобных целей. И если так делать, то нужно брать на себя обязательства: не применять этот финт (а необходимость в нем вполне может возникнуть). В случае с определением массива по свойствам/методам, программист берет на себя обязательства следить за тем, что бы у других объектов не появился весь проверяемый набор свойств/методов. Так чем эти способы принципиально отличаются?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать электронный каталог продукции? natarius Серверные языки и технологии 6 24.05.2009 20:56
Как сделать, чтобы 2 ссылки отображались как hover при наведении мышкой на любую? Ava Элементы интерфейса 5 19.05.2009 23:24
как можно создать iframe со скриптами GOll Общие вопросы Javascript 2 05.05.2009 11:32
как найти нужный объект? `p r o x y jQuery 2 05.05.2009 01:12
форма как в ExtJS 2 magistr_bender Общие вопросы Javascript 0 11.09.2008 16:01