Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как опознать RegExp. (https://javascript.ru/forum/misc/4224-kak-opoznat-regexp.html)

Kolyaj 03.07.2009 14:06

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

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

Я знаю только один надежный вариант, может узнаю еще парочку :)

Octane 03.07.2009 14:17

alert(Object.prototype.toString.call(/./) == "[object RegExp]");

Riim 03.07.2009 14:17

1. instanceof
2. constructor
3. наличие методов которые есть только у RegExp

Riim 03.07.2009 14:20

Цитата:

Сообщение от Octane
alert(Object.prototype.toString.call(/./) == "[object RegExp]");

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


Видно просто !!window.opera уже не модно.

Kolyaj 03.07.2009 14:27

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

Цитата:

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

Все плохо и не во всех случаях работает.

Цитата:

Сообщение от Riim
Видно просто !!window.opera уже не модно.

!!window.opera не защищено от var opera = true;

Riim 03.07.2009 14:36

Цитата:

Сообщение от Kolyaj
Все плохо и не во всех случаях работает.

Цитата:

Сообщение от Kolyaj
!!window.opera не защищено от var opera = true;

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

Kolyaj 03.07.2009 14:46

Цитата:

Сообщение от Riim
в конечном счете, все равно можно было обмануть

function isArray(obj) {
    return Object.prototype.toString.call(obj) == '[object Array]';
}

Это не обмануть.

Riim 03.07.2009 14:49

Цитата:

Сообщение от Kolyaj
Это не обмануть.

Легко:
function isArray(obj) {
    return Object.prototype.toString.call(obj) == '[object Array]';
}
Object.prototype.toString = function() {return ''};
var a = [];
alert(isArray(a));

Kolyaj 03.07.2009 15:05

Поправлюсь: не обмануть псевдо-массивом. А после финта
Цитата:

Сообщение от Riim
Object.prototype.toString = function() {return ''};

что угодно может сломаться в самых неожиданных местах.

Riim 03.07.2009 15:36

Цитата:

Сообщение от Kolyaj
А после финта

Цитата:

Сообщение от Kolyaj
что угодно может сломаться в самых неожиданных местах.

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


Часовой пояс GMT +3, время: 14:28.