typeof

Оператор typeof повертає рядок, що вказує тип необчисленого операнду.

Синтакс

Оператор 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 Latest Draft (ECMA-262)
The definition of 'The typeof Operator' in that specification.
Draft
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.

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
typeofChrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 3Opera Full support YesSafari Full support YesWebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support 1.0nodejs Full support Yes

Legend

Full support  
Full support

Примітки щодо IE

У IE 6, 7 та 8 багато хост-об'єктів є об'єктами, а не функціями. Для прикладу:

typeof alert === 'object'

Див. також