- PVSM.RU - https://www.pvsm.ru -
Начиная какой-то более-менее сложный и комплексный проект с использованием JavaScript, перед разработчиком может встать выбор о том, какую библиотекуфреймворк использовать. Если речь идет о веб-разработке, то jQuery — это, априори, библиотека №1 — лаконичная, простая, удобная. Но за слепой любовью к ней кроется немало, если и не устаревших, то уж точно таких вещей, которые можно сделать лучше.
Вышеупомянутая библиотека имеет статический метод для проверки типов — это jQuery.type [1]. Окунемся в тонкости его работы и, для этого, взглянем на исходный код [2]. Увидим что изначально пришедший аргумент проверяется на null
и, при положительном результате, тип аргумента приводится к строке и возвращается. В иных случаях идет проверка средствами языковых конструкций и выполняется сравнительно точная типизация, но минус такого подхода — медлительность из-за вызова метода toString
и неточное определение типа, в следствии чего приходится писать дополнительные конструкции, позволяющие «уточнить» тип сущности.
Основная идея 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
А теперь взгляните [4] на то, как проверяется plainObject
у jQuery и как это делает [5] TypeOf. Думаю слова излишни.
Функция всегда будет возвращать объект, содержащий два свойства: type
, subtype
и метод: is
. По названиям, думаю, не мудрено догадаться о том, что на них возложено. По умолчанию, свойство subtype
— это булево значение которое равняется false
. Измениться оно может лишь в случаях, когда TypeOf принимает в качестве аргумента число с плавающей точкой, так называемый not-a-number [6] и объект, будь он простым либо содержащим 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, в среднем, отрабатывает в полтора-два раза быстрее.
TypeOf
.Автор: BR0kEN
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/59361
Ссылки в тексте:
[1] jQuery.type: https://api.jquery.com/jQuery.type/
[2] исходный код: https://github.com/jquery/jquery/blob/master/src/core.js#L249-L257
[3] TypeOf: https://github.com/BR0kEN-/TypeOf
[4] взгляните: https://github.com/jquery/jquery/blob/master/src/core.js#L222-L239
[5] делает: https://github.com/BR0kEN-/TypeOf/blob/master/lib/typeof.js#L16-L18
[6] not-a-number: http://ru.wikipedia.org/wiki/NaN
[7] http://br0ken-.github.io/TypeOf/: http://br0ken-.github.io/TypeOf/
[8] Propeople Ukraine: http://wearepropeople.com/
[9] Источник: http://habrahabr.ru/post/220943/
Нажмите здесь для печати.