Оператор typeof
повертає рядок, що вказує тип необчисленого операнду.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Синтакс
Оператор typeof
супроводжується операндом:
typeof operand typeof(operand)
Параметри
operand
- Вираз, що представляє об'єкт або примітив, тип якого потрібно повернути.
Опис
Наступна таблиця наводить можливі значення, повернені typeof
. Для отримання додаткової інформації про типи та прості значення, дивіться також статтю про Структури даних JavaScript.
Тип | Результат |
---|---|
Undefined | "undefined" |
Null | "object" (дивіться нижче) |
Boolean | "boolean" |
Number | "number" |
BigInt (нове у ECMAScript 2020) | "bigint" |
String | "string" |
Symbol (нове у ECMAScript 2015) | "symbol" |
Об'єкт Function (реалізує [[Call]] in ECMA-262 terms) | "function" |
Будь-який інший об'єкт | "object" |
Заувага: ECMAScript 2019 та старші версії дозволяли у реалізаціях typeof
повертати будь-яке рядкове значення, визначене реалізацією, для об'єктів, які не можна викликати, а також нестандартних екзотичних об'єктів.
Єдиним відомим переглядачем, який дійсно скористався цією можливістю, був старий Internet Explorer (дивіться нижче).
Приклади
// Числа
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof(42) === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // Незважаючи на те, що є "Not-A-Number" (не-числом)
typeof Number('1') === 'number'; // Number намагається розібрати значення як числа
typeof Number('чобіт') === 'number'; // також значення, які не можуть бути приведені до числових
typeof 42n === 'bigint';
// Рядки
typeof '' === 'string';
typeof 'бла' === 'string';
typeof `шаблонний літерал` === 'string';
typeof '1' === 'string'; // зауважте, що число у рядку все ж має тип string
typeof (typeof 1) === 'string'; // typeof завжди повертає string
typeof String(1) === 'string'; // String перетворює будь-що у рядок, безпечніше, ніж toString
// Булеві значення
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(1) === 'boolean'; // Boolean() перетворює значення на підставі того, чи є вони правдивими, чи хибними
typeof !!(1) === 'boolean'; // два виклики оператора ! (логічне НЕ) еквівалентні Boolean()
// Символи
typeof Symbol() === 'symbol'
typeof Symbol('ква') === 'symbol'
typeof Symbol.iterator === 'symbol'
// Undefined
typeof undefined === 'undefined'; // змінна, що має значення undefined
typeof declaredButUndefinedVariable === 'undefined'; // оголошена змінна без значення
typeof undeclaredVariable === 'undefined'; // неоголошена змінна
// Об'єкти
typeof {a: 1} === 'object';
// Використовуйте Array.isArray або Object.prototype.toString.call,
// щоб відрізнити звичайні об'єкти від масивів
typeof [1, 2, 4] === 'object';
typeof new Date() === 'object';
typeof /regex/ === 'object'; // Дивіться історичні результати у розділі Регулярні вирази
// Наведені вирази є заплутаними, небезпечнимм та марнотратними. Уникайте їх.
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String('abc') === 'object';
// Функції
typeof function() {} === 'function';
typeof class C {} === 'function';
typeof Math.sin === 'function';
Додаткова інформація
null
// Так було від початку існування JavaScript
typeof null === 'object';
У першій реалізації JavaScript, значення JavaScript були представлені у вигляді мітки типу та значення. Міткою типу для об'єкта був 0. null
був представлений нульовим вказівником (0x00 у більшості платформ). Відповідно, null мав міткою типу 0, звідси повернене значення "object" у typeof
. (посилання)
Було запропоноване виправлення для ECMAScript (як експериментальна функціональність), але воно було відхилене. Воно змінило б результат на typeof null === 'null'
.
Використання оператора new
// Усі функції-конструктори, за винятком конструктора Function, завжди матимуть тип 'object'
var str = new String('String');
var num = new Number(100);
typeof str; // Це поверне 'object'
typeof num; // Це поверне 'object'
var func = new Function();
typeof func; // Це поверне 'function'
Необхідність круглих дужок для синтаксису
// Круглі дужки можуть використовуватись для визначення типу виразу.
var iData = 99;
typeof iData + ' Wisen'; // 'number Wisen'
typeof (iData + ' Wisen'); // 'string'
Регулярні вирази
Регулярні вирази, доступні для виклику, були нестандартним доповненням у деяких переглядачах.
typeof /s/ === 'function'; // Chrome 1-12 не відповідає ECMAScript 5.1
typeof /s/ === 'object'; // Firefox 5+ відповідає ECMAScript 5.1
Помилки
До ECMAScript 2015 typeof
гарантовано повертав рядок для будь-якого наданого операнда. Навіть для неоголошених ідентифікаторів typeof
повертав 'undefined'
. Використання typeof
ніяк не могло згенерувати помилку.
Але з додаванням блочних областей видимості у let
та const
, використання typeof
на змінних, створених через let
та const
(або використання typeof
на класі), у блоці до того, як вони були оголошені, викине помилку ReferenceError
. Змінні блочної області видимості знаходяться у "тимчасовій мертвій зоні" від початку блоку до завершення ініціалізації, спроба звернення до них в цей час викине помилку.
typeof undeclaredVariable === 'undefined';
typeof newLetVariable; // ReferenceError
typeof newConstVariable; // ReferenceError
typeof newClass; // ReferenceError
let newLetVariable;
const newConstVariable = 'привіт';
class newClass{};
Винятки
Усі нинішні переглядачі відкривають нестандартний хост-об'єкт document.all
з типом undefined
.
typeof document.all === 'undefined';
Хоча специфікація дозволяє користувацькі мітки типів для нестандартних екзотичних об'єктів, вона вимагає, щоб ці мітки відрізнялись від попередньо визначених. Випадок використання у document.all
типу 'undefined'
класифікується у веб-стандартах як "умисне порушення" оригінального стандарту ECMA JavaScript.
Специфікації
Специфікація | Статус | Коментар |
---|---|---|
ECMAScript (ECMA-262) The definition of 'The typeof Operator' in that specification. |
Living Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'The typeof Operator' in that specification. |
Standard | |
ECMAScript 5.1 (ECMA-262) The definition of 'The typeof Operator' in that specification. |
Standard | |
ECMAScript 3rd Edition (ECMA-262) The definition of 'The typeof Operator' in that specification. |
Standard | |
ECMAScript 1st Edition (ECMA-262) The definition of 'The typeof Operator' in that specification. |
Standard | Початкове визначення. Реалізоване у JavaScript 1.1. |
Сумісність з веб-переглядачами
BCD tables only load in the browser
Примітки щодо IE
У IE 6, 7 та 8 багато хост-об'єктів є об'єктами, а не функціями. Для прикладу:
typeof alert === 'object'