Метод Array.isArray()
Для проверки типа на массив есть специальный метод: Array.isArray(arr) . Он возвращает true только если arr – массив:
alert( Array.isArray([1,2,3]) ); // true alert( Array.isArray("not array")); // false
Но этот метод – единственный в своём роде.
Других аналогичных, типа Object.isObject , Date.isDate – нет.
Оператор instanceof
Оператор instanceof позволяет проверить, создан ли объект данной функцией, причём работает для любых функций – как встроенных, так и наших.
function User() {} var user = new User();
alert( user instanceof User ); // true
Таким образом, instanceof , в отличие от [[Class]] и typeof может помочь выяснить тип для новых объектов, созданных нашими конструкторами.
Заметим, что оператор instanceof – сложнее, чем кажется. Он учитывает наследование, которое мы пока не проходили, но скоро изучим, и затем вернёмся к instanceof в главе Проверка класса: "instanceof".
Утиная типизация
Альтернативный подход к типу – «утиная типизация», которая основана на одной известной пословице: «If it looks like a duck, swims like a duck and quacks like a duck, then it probably is a duck (who cares what it really is)».
В переводе: «Если это выглядит как утка, плавает как утка и крякает как утка, то, вероятно, это утка (какая разница, что это на самом деле)». Смысл утиной типизации – в проверке необходимых методов и свойств.
Например, мы можем проверить, что объект – массив, не вызывая Array.isArray , а просто уточнив наличие важного для нас метода, например
splice :
var something = [1, 2, 3];
if (something.splice) {
alert( 'Это утка! То есть, массив!' );
}
Обратите внимание – в if мы не вызываем метод something.splice() , а пробуем получить само свойство something.splice . Для массивов оно всегда есть и является функцией, т.е. даст в логическом контексте true .
Проверить на дату можно, определив наличие метода getTime :
var x = new Date();
if (x.getTime) { alert( 'Дата!' );
alert( x.getTime() ); // работаем с датой
}
С виду такая проверка хрупка, ее можно «сломать», передав похожий объект с тем же методом.
Но как раз в этом и есть смысл утиной типизации: если объект похож на дату, у него есть методы даты, то будем работать с ним как с датой (какая разница, что это на самом деле).
То есть, мы намеренно позволяем передать в код нечто менее конкретное, чем определённый тип, чтобы сделать его более универсальным.
Do'stlaringiz bilan baham: |