Знати, якого типу фрагмент даних, часто дуже важливо, щоб код працював гладко й без помилок.
У Javascript є кілька способів перевірити тип значення або обʼєкта.
Механізми перевірки типів у Javascript можуть бути дещо ненадійними.
Для кращої безпеки типів і надійніших типів, імовірно, варто використовувати TypeScript, мову, що будується на JavaScript, але з синтаксисом типів статично типізованої мови.
typeof
Оператор typeof повертає тип свого операнда.
Результатом є рядок тексту (англ. string), який збігається з назвою одного з примітивних типів даних, за винятком "null".
Він також може бути "function" або "object".
typeof undefined;
// => "undefined"
typeof true;
// => "boolean"
typeof 42;
// => "number"
typeof 'Hello, World!';
// => "string"
typeof function () {
return 'Hello, World';
};
// => "function"
typeof [1, 2, 3, 4];
// => "object"
typeof { city: 'Stockholm', country: 'Sweden' };
// => "object"
[Історичні причини][typeof null is "object"].
instanceof
Щоб перевірити тип обʼєкта, можна скористатися оператором instanceof.
Він обчислюється в boolean залежно від того, чи включено другий операнд у ланцюжок прототипів першого операнда.
Уточнімо: instanceof повертає, чи є перший операнд екземпляром другого операнда або одного з його дочірніх класів.
instanceof працює лише з обʼєктами.
class Beverage {
// ...
}
// The Coffee class is a child of the Beverage class.
class Coffee extends Beverage {
// ...
}
const java = new Coffee();
java instanceof Coffee;
// => true
java instanceof Beverage;
// => true
Клас Array має метод Array.isArray(), який перевіряє, чи є його аргумент масивом.
Хоча instanceof Array не працюватиме з масивом, створеним в іншому realm, як-от iframe на вебсторінці, Array.isArray() працюватиме.
Річ у тім, що клас Array має різний конструктор у кожному realm, і кожен iframe має власний realm, а отже, функція в ланцюжку прототипів буде іншою, що спричиняє помилку instanceof Array.
Array.isArray() здатен це ігнорувати, і його слід завжди використовувати, коли це можливо.
Він також допомагає уникнути хибних спрацювань, коли обʼєкт насправді не є Array, а лише має Array у своєму ланцюжку прототипів.
({ __proto__: Array.prototype }) instanceof Array
// => true
Array.isArray({ __proto__: Array.prototype })
// => false
in
Оператор in повертає, чи є перший операнд властивістю другого операнда.
Він не перевіряє, чи має властивість визначене значення.
Властивість, встановлена в undefined, усе одно буде виявлена оператором in.
class Coffee {
constructor() {
this.temperature = 'hot';
this.isDarkMatter = undefined;
}
coolDown() {
this.temperature = 'warm';
}
}
const espresso = new Coffee();
'temperature' in espresso;
// => true
'color' in espresso;
// => false
'isDarkMatter' in espresso;
// => true
in поверне true для успадкованих властивостей і методів.
"coolDown" in espresso
// => true
"constructor" in espresso
// => true
Щоб цього уникнути, натомість варто використовувати Object.hasOwn()
Object.hasOwn()
Метод Object.hasOwn() повертає, чи належить вказаному обʼєкту задана властивість (вона не успадкована і не є методом).
class Coffee {
constructor() {
this.temperature = 'hot';
}
coolDown() {
this.temperature = 'warm';
}
}
const cappuccino = new Coffee();
Object.hasOwn(cappucino, 'temperature');
// => true
Object.hasOwn(cappucino, 'constructor');
// => false
Object.hasOwn(cappucino, 'coolDown');
// => false