Альтернативная реализация isType()


Выявление типов в JavaScript хреново

Этот ответ описывает стандартный способ проверки типа объекта JavaScript (в частности, массив):

Метод, приведенный в стандарте ECMAScript, чтобы найти класс Объект состоит в использовании метода toString объекта.прототип.

if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
    alert( 'Array!' ); }

Почему злоупотребление объект.прототип.метод toString? Получается, что объекты, созданные в разных кадрах есть различные конструкторы.

для вызова typeof работает только для объектов, которые являются (или эквивалент) примитивы, как струны.

Другой способ?

Код, приведенный выше, заставляет меня чувствовать себя смешным внутри, и не имеет возможность работать для пользовательских типов, поэтому я написал это [суть]:

function isType(object, type){
     return object != null && type ? object.constructor.name === type.name : object === type;
}

Вы используете его так:

isType([1, 2, 3], Array);
isType(null, null);
isType('foo', String);

мауке на ##JavaScript-код указывает, что это не для объектов, чьи конструкторы имеют то же имя, что и тип вы тестируете против:

isType(new (function String(){}), String);

Я думаю, что мне нравится такое поведение более, чем вызов каждого пользовательского типа объекта.

Чтобы сделать еще один шаг вперед

jQuery имеет 25 линий isPlainObject сказать, если что-то является простым объектом ({ фу: 'бар' }).

В каких случаях делает jQuery версии ведут себя более правильно, чем...

isType(thing, Object);

?

Отказ от ответственности: я не проверял этот код в кучу случаев или в кучу браузеров. Опыт, сконцентрированный в источник jQuery и может унести меня обратно в садик.



365
3
задан 10 октября 2011 в 04:10 Источник Поделиться
Комментарии
2 ответа

Я не мог найти ничего плохого с вашим кодом,
поэтому в мета я собираюсь рассказать вам, почему это круто ;)


  • Проверка .метод toString() , это неприглядное, метод toString() может быть легко заменен/расширенные

  • Ваше решение работает во фреймах

  • Я не смог сломать его.

На последнее замечание, мне кажется, что нужно проверить тип объекта ( кроме заявления ) означает, вы делаете что-то странное и, возможно, код должен быть повторно мысли.

Тем не менее, я favouriting этот вопрос.

Обновление : получается, что по данным см. Этот тест jsperf, ваше решение гораздо медленнее :\

5
ответ дан 16 января 2014 в 07:01 Источник Поделиться

Хорошо, я собираюсь сосредоточиться на некоторых потенциальных ошибок с вашей isType функции.

Первый очевидный вопрос вы полагаетесь на конструктор.имя создается. Это не всегда так, например, рассмотрим любой класс объявлен ВАР класса MyClass = функция() {}. Теперь, если вы запустите (нового класса MyClass).конструктор.имя === "". Кроме того, многие фреймворки предоставляют некоторый класс расширение/конструкции, такие как в MooTools , которые опровергали бы это проверить. Дальнейшие вопросы могут представить себя с минификации кода.

Из любопытства, я решил подключить свой код в JS и подчеркнуть тестов, чтобы увидеть, как он будет делать. Я не смог реализовать _.isObject как он принимает несколько типов объектов. Она проходит все тесты, но для Нэн понятно. Я исключил iframe в тестах, поскольку я не мог заставить их работать на логи или jsbin, но они проходят так же. Не плохо :)!

enter image description here

Редактировать это также не работает для объектов, созданных через объект.создать , к сожалению.

isType(объект.создать(нуль), объект) будет бросать исключение TypeError как результирующий объект будет иметь конструктор собственность

Аналогичным образом она будет выполнена для любого объекта, который имеет конструктор собственность... подумайте

var obj = {
constructor: "foo"
};

Правка 2 кажется, это тоже неправильно? предполагает аргументы объекта.

(function() {
isType(arguments, Object) === true;
})([1])

2
ответ дан 17 апреля 2014 в 05:04 Источник Поделиться