Да, что-то в этом роде. Вот соответствующая часть из спецификации :
11.8.6 Оператор instanceof
Производство RelationalExpression : RelationalExpression instanceof ShiftExpression оценивается следующим образом:
- Пусть lref будет результатом вычисления RelationalExpression .
- Пусть lval будет GetValue ( lref ).
- Пусть rref будет результатом вычисления ShiftExpression .
- Пусть rval будет GetValue ( rref ).
- Если тип ( rval ) не является объектом, выдается исключение TypeError .
- Если rval не имеет внутреннего метода [[HasInstance]], выбросить исключение TypeError .
- Возвращает результат вызова внутреннего метода [[HasInstance]] для rval с аргументом lval .
где вызов метода [[HasInstance]] определяется как
15.3.5.3 [[HasInstance]] (V)
Предположим, F является объектом Function.
Когда внутренний метод [[HasInstance]] для F вызывается со значением V , предпринимаются следующие шаги:
- Если V не является объектом, вернуть false .
- Пусть O будет результатом вызова внутреннего метода [[Get]] для F с именем свойства " prototype ".
- Если тип ( O ) не является объектом, выведите исключение TypeError .
- Повторите
а. Пусть V будет значением внутреннего свойства [[Prototype]] V .
б. Если V равно null , верните false .
с. Если O и V относятся к одному и тому же объекту, верните true .
Относительно производительности: это, вероятно, зависит от реальных реализаций в браузерах. Между ними могут быть огромные различия, поэтому лучше всего сделать несколько тестов, например, с http://jsperf.com/.
Проблема с instanceof
в том, что он может не работать, если вы вызываете его для элементов из разных контекстов, таких как фрейм или фрейм. Например, пусть a
будет объектом, к которому вы можете получить доступ через iframe.contentWindow.a
, и вы хотите проверить, является ли он массивом, тогда
iframe.contentWindow.a instanceof Array
вернет false
.