Краткое описание
Оператор typeof возвращает строку, указывающую тип операнда, не производя конечных вычислений
Синтаксис
Оператор typeof следует за своим операндом:
typeof операнд
Параметры
операнд является выражением, представляющим объект или primitive, тип которого должен быть возвращен.
Описание
В следующей таблице приведены возможные возвращаемые значения typeof. Для получения дополнительной информации о типах и примитивов, смотрите также страницу структуры данных JavaScript.
| Type | Result |
|---|---|
| Undefined | "undefined" |
| Null | "object" (see below) |
| Boolean | "boolean" |
| Number | "number" |
| String | "string" |
| Symbol (новый тип из ECMAScript 6) | "symbol" |
| Host object (определено JS средой) | Зависит от имплементации |
| Function object (имплементирует [[Call]] в ECMA-262 условиях) | "function" |
| Любой другой тип | "object" |
Примеры
Обычные случаи применения
// Числа
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // Несмотря на то, что это "Not-A-Number" (не число)
typeof Number(1) === 'number'; // Никогда не используйте эту запись!
// Строки
typeof "" === 'string';
typeof "bla" === 'string';
typeof (typeof 1) === 'string'; // typeof всегда вернет в этом случае строку
typeof String("abc") === 'string'; // Никогда не используйте эту запись!
// Booleans
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(true) === 'boolean'; // Никогда не используйте эту запись!
// Символы
typeof Symbol() === 'symbol'
typeof Symbol('foo') === 'symbol'
typeof Symbol.iterator === 'symbol'
// Не определено
typeof undefined === 'undefined';
typeof blabla === 'undefined'; // Неопределенная переменная
// Объекты
typeof {a:1} === 'object';
// Используйте Array.isArray или Object.prototype.toString.call
// чтобы дифференцировать регулярные объекты массивов
typeof [1, 2, 4] === 'object';
typeof new Date() === 'object';
// То что ниже приводит к ошибкам и проблемам. Не использовать!
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String("abc") === 'object';
// Функции
typeof function(){} === 'function';
typeof Math.sin === 'function';
null
// Это было определено с рождения JavaScript typeof null === 'object';
В первой реализации JavaScript значения были представлены как тип тега и значения. Тип тега для объектов был 0. null был представлен как указатель null (0x00 в большинстве платформ). Следовательно, null был нулем как тип тег, поэтому typeof возвращаемое значение - поддельно. (подробнее)
Исправление было предложено в ECMAScript (через отключение), но было отклонено. Это привело бы к тому, что typeof null === 'null'.
Регулярные выражения
Вызываемые регулярные выражения были нестандартным дополнением в некоторых браузерах.
typeof /s/ === 'function'; // Chrome 1-12 Не соответствует ECMAScript 5.1 typeof /s/ === 'object'; // Firefox 5+ Соответствует ECMAScript 5.1
Спецификация
| Спецификация | Статус | Комментарий |
|---|---|---|
| ECMAScript 1st Edition. | Standard | Начальное определение. Имплементировано в JavaScript 1.1 |
| ECMAScript 5.1 (ECMA-262) Определение 'The typeof Operator' в этой спецификации. |
Стандарт | |
| ECMAScript 6 (ECMA-262) Определение 'The typeof Operator' в этой спецификации. |
Черновик |
Совместимость с браузерами
| Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Basic support | (Да) | (Да) | (Да) | (Да) | (Да) |
| Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| Basic support | (Да) | (Да) | (Да) | (Да) | (Да) | (Да) |
Хост-объекты IE являются объектами, а не функциями
В IE 6, 7, и 8 большинство хост-объектов это объекты, а не функции. Например:
typeof alert === 'object'