...

суббота, 26 апреля 2014 г.

TypeOf — проверка типа сущности в JavaScript

TypeOf javascript library

Начиная какой-то более-менее сложный и комплексный проект с использованием JavaScript, перед разработчиком может встать выбор о том, какую библиотеку\фреймворк использовать. Если речь идет о веб-разработке, то jQuery — это, априори, библиотека №1 — лаконичная, простая, удобная. Но за слепой любовью к ней кроется немало, если и не устаревших, то уж точно таких вещей, которые можно сделать лучше.


Ответвимся к проверкам типов




Вышеупомянутая библиотека имеет статический метод для проверки типов — это jQuery.type. Окунемся в тонкости его работы и, для этого, взглянем на исходный код. Увидим что изначально пришедший аргумент проверяется на null и, при положительном результате, тип аргумента приводится к строке и возвращается. В иных случаях идет проверка средствами языковых конструкций и выполняется сравнительно точная типизация, но минус такого подхода — медлительность из-за вызова метода toString и неточное определение типа, в следствии чего приходится писать дополнительные конструкции, позволяющие «уточнить» тип сущности.



Теперь расскажу о «синей таблетке» — том, что предлагаю я — TypeOf




Основная идея TypeOf — это проверка по конструктору. В исходном коде библиотеки не выполняется никаких методов, а только сверяется конструктор с объектами или же, в нескольких особых случаях, выполняется дополнительная проверка по свойству length для определения массивов, деление по модулю — для float либо нативная языковая функция isNaN — для проверки случаев, когда не удается привести тип к числу.

Например, вы можете делать так:



TypeOf(document.getElementsByTagName('script')).is('node'); // true
TypeOf(document.getElementsByTagName('script')).is('array'); // true




node — это подтип объекта, тип которого — array. Звучит немного запутанно, но JavaScript — язык в котором все — это объект.

Попробую немного прояснить ситуацию и приведу еще один блок кода:



jQuery.type(document.getElementById('demo')).is('node'); // true
jQuery.type(document.getElementById('demo')).is('object'); // true




Разница вышеуказанных примеров заключается в том, что в первом мы получаем массив объектов типа NodeObject, а во втором — лишь один объект этого же типа. Все просто и jQuery так не умеет :)

Самая занятная ситуация касается проверки типа так называемого plainObject. Далее я приведу примеры того, как это проверить с помощью jQuery и TypeOf.



// jQuery
jQuery.isPlainObject({}); // true

// TypeOf
TypeOf({}).is('plain'); // true




А теперь взгляните на то, как проверяется plainObject у jQuery и как это делает TypeOf. Думаю слова излишни.

Подробнее о функции TypeOf и возвращаемом ею объекте




Функция всегда будет возвращать объект, содержащий два свойства: type, subtype и метод: is. По названиям, думаю, не мудрено догадаться о том, что на них возложено. По умолчанию, свойство subtype — это булево значение которое равняется false. Измениться оно может лишь в случаях, когда TypeOf принимает в качестве аргумента число с плавающей точкой, так называемый not-a-number и объект, будь он простым либо содержащим NodeObject объекты.

Методом is вы можете проверить тип, передав ему один из следующих аргументов: NaN, null, bool, node, plain, float, array, string, number, object, function, undefined. В тех случаях, когда проверка будет осуществляться на NaN, float, node или plain метод будет сверять аргумент с подтипом. Важно заметить, что параметр метода — это строка и результатом выполнения, например, следующего кода:



TypeOf(null).is(null);




будет false.

Поддержка браузеров и производительность




TypeOf с уверенностью будет работать везде, где есть JavaScript, т.е. абсолютно в любом браузере. Также, на основе проведенных тестов, с уверенностью могу заявить что TypeOf, в среднем, отрабатывает в полтора-два раза быстрее.

Демонстрация и репозиторий





  • http://ift.tt/1nvN7ed — тут располагается git-репозиторий проекта и в его описании вы сможете подробно узнать об объекте, возвращаемом функцией TypeOf.

  • http://ift.tt/1k5ZNTY — демонстрация. При попытке открыть страницу в устаревших браузерах будут проблемы из-за отсутствия функционала, используемого только для демонстрации. Чтобы тестировать саму библиотеку в экстремальных условиях, вам необходимо работать с ее исходным кодом напрямую.








С наилучшими пожеланиями,

Сергей Бондаренко, Web Developer в Propeople Ukraine.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий