Определение типов/классов в JavaScript
Сводные таблички к статье JavaScript, typeof, типы и классы.
typeof value
| Значение | typeof | Примечания |
| Number | number | включая NaN и Infinity |
| Boolean | boolean | |
| String | string | |
| null | object | в ES5.1 будет заменён на "null" |
| undefined | undefined | |
| Function | function |
в IE 6,7,8 typeof alert === "object"(вообще любая host-функция, например, document.getElementById)
|
| всё остальное | object |
Safari: typeof HTMLCollection === "function"Chrome <=12: typeof regexp === "function".
|
Объекты-обёртки над примитивными значениями, созданные через new всегда "object":
| new Number(1) | object |
| new Boolean(true) | object |
| new String("string") | object |
Без new результат корректный, так как возвращается скаляр:
| Number(1) | number |
| Boolean(true) | boolean |
| String("string") | string |
Object.prototype.toString.call(value)
| Значение | typeof | Примечания |
| Number | [object Number] | включая NaN и Infinity |
| Boolean | [object Boolean] | |
| String | [object String] | |
| null | [object Null] |
Firefox 3: [object Window]IE < 9: [object Object]Opera < 11: [object Window]
|
| undefined | [object Undefined] |
Firefox 3: [object Window]IE < 9: [object Object]Opera < 11: [object Window]
|
| Function | [object Function] |
IE 6, 7, 8 для alert: [object Object]
|
| Array | [object Array] | |
| RegExp | [object RegExp] | |
| Error | [object Error] | в том числе и производные SyntaxError, TypeError... |
| arguments | [object Arguments] |
IE < 9, Firefox 3, Opera 10: [object Object]
|
| DOMElement (DIV) | [object HTMLDivElement] |
Для каждого тега свой IE < 9: [object Object]
|
| TextNode | [object Text] |
IE < 9: [object Object]
|
| HTMLCollection |
[object HTMLCollection] (Firefox, IE 9) [object NodeList] (Chrome, Opera, Safari) [object Object] (IE < 9) |
|
| остальные объекты | [object Object] | |
Конструкторы built-in объектов
| Значение | constructor | === (*) | instanceof (**) | constructor.name (***) |
| Number | Number | да | нет | "Number" |
| Boolean | Boolean | да | нет | "Boolean" |
| String | String | да | нет | "String" |
| Function | Function | да | да | "Function" |
| null | нет | |||
| undefined | нет | |||
| Array | Array | да | да | "Array" |
| Object (простой {}) |
Object | да | да | "Object" |
| Date | Date | да | да | "Date" |
| RegExp | RegExp | да | да | "RegExp" |
| Arguments | Object | "Object" |
* ===: можно ли определить тип сравнением с конструктором ("string".constructor === String)
** instanceof: можно ли для определения типа использовать instanceof (!("string" instanceof String))
***: в IE (во всех включая 9-й) нет constructor.name в остальных браузерах работает нормальноp
Конструкторы host-объектов
Здесь компактной табличкой не обойдёшься.IE
В IE (до 7-й версии включительно) у DOM-объектов вообще нет конструкторов.
Ниже под фразой «во всех браузерах» подразумевается «во всех, кроме IE <= 7».
constructor.name
constructor.name DOM-объектов содержит нечто вменяемое только у Chrome.
В остальных браузерах, либо вообще нет свойства, либо в нём какая-то ересь.
DOM-элемент
У каждого тега свой конструктор: HTMLDivElement, HTMLSpanElement.
Однако, все они наследуются от HTMLElement.
Следующий код позволяет определить DOM-элемент во всех браузерах (IE > 8 *):
var element = document.createElement("div");
element instanceof HTMLElement; // true
(*) В IE8 появляются конструкторы у host-объектов, а также нижеприведённые глобальные конструкторы Text, HTMLCollection.
Но вот HTMLElement там ещё нет.
TextNode
Определение TextNode во всех браузерах:
var textNode = document.createTextNode("text");
textNode instanceof Text; // true
При этом попытка вывести textNode.constructor.toString() может привести в замешательство:
В Safari это будет TextConstructor, но всё равно доступный через глобальную переменную Text.
В Oper'е раньше 10-й конструктором вообще будет Object, но всё равно работает instanceof Text.
HTMLCollection
Определение HTMLCollection во всех браузерах:
var collection = document.getElementsByTagName("div");
(collection instanceof HTMLCollection) || (collection instanceof NodeList);
Во всех браузерах есть, как глобальный объект HTMLCollection, так и NodeList. Однако в каждом браузере коллекция наследуется от одного из них:
HTMLCollection: (Firefox, IE 8+).
NodeList: (Chrome, Opera, Safari).
При этом collection.constructor.toString() также, как и с текстовой нодой может давать разные результаты: NodeListConstructor (Safari), Object (Firefox < 11, Opera < 11).
Также не следует полагаться на прямое сравнение с конструктором: collection.constructor === HTMLCollection.
IE < 8 и host-объекты
В IE host-объекты можно определять только по наличию в них специфических свойств.
value.nodeType === 1; // DOM-Element value.nodeType === 3; // TextNode typeof value.length === "number"; // HTMLCollection
Хорошим свидетельством того, что это именно host-объект, а не какой-либо пользовательский объект со свойством nodeType,
служит отсутствие в нём свойств constructor и toString.
host-функции (alert, document.getElementById и т.д.) можно идентифицировать по их строковому представлению.
Там будет что-нибудь вроде function alert() { [native code] }:
if (("" + value).indexOf("function") !== -1) {
// value is function
}
У host-функций нет даже метода toString(), но вполне срабатывает приведение к строке через ("" + value).

