Знання типу, до якого належить фрагмент даних, часто дуже важливе для того, щоб код працював гладко й без помилок.
У 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 не працюватиме з масивом, створеним в іншому середовищі, наприклад в iframe на вебсторінці, Array.isArray() спрацює.
Це тому, що клас Array має різний конструктор у кожному середовищі, і кожен iframe має власне середовище, а отже, функція в ланцюжку прототипів буде іншою, через що 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
Нас найняв центр переробки. Через брак місця всі продукти кладуть на один конвеєр, але через це різні матеріали змішуються між собою й стають непридатними. Щоб це виправити, нам доручили створити функції, які визначають тип продукту.
Реалізуйте функцію isBoolean, яка перевіряє, чи є значення булевим (англ. Boolean).
isBoolean(true);
// => true
isBoolean(null);
// => false
Реалізуйте функцію isNumber, яка перевіряє, чи є значення скінченним number або bigint, тобто не NaN і не Infinity.
Іноді пристрій для зчитування ідентифікаторів дає збій і зчитує нечислове значення як NaN (не число) або Infinity.
Наша функція також повинна правильно це обробляти.
isNumber(42);
// => true
isNumber('Hello, World!');
// => false
isNumber(42n);
// => true
isNumber(NaN);
// => false
Реалізуйте функцію isObject, яка повинна перевіряти, чи є значення обʼєктом.
На конвеєрі null не означає нічого, і його не вважають обʼєктом.
isObject({ greeting: 'Hello' });
// => true
isObject(25n);
// => false
Реалізуйте функцію isNumericString, яка повинна перевіряти, чи є значення рядком тексту (англ. string), що складається лише з цифр або з мінуса й цифр після нього, які позначають відʼємне число.
Розглядаємо лише цілі числа: десяткові числа не вважаються числовими для цієї перевірки робота-переробника.
isNumericString(42);
// => false
isNumericString('42');
// => true
isNumericString('Hi!');
// => false
Реалізуйте функцію isElectronic, яка перевіряє, чи є обʼєкт екземпляром наданого класу ElectronicDevice або одного з його дочірніх класів.
class Duck {
//...
}
class WashingMachine extends ElectronicDevice {
//...
}
isElectronic(new Duck());
// => false
isElectronic(new WashingMachine());
// => true
Реалізуйте функцію isNonEmptyArray, яка перевіряє, чи є значення непорожнім масивом.
isNonEmptyArray([1, 2, 3]);
// => true
isNonEmptyArray([]);
// => false
Реалізуйте функцію isEmptyArray, яка перевіряє, чи є значення порожнім масивом.
isEmptyArray([1, 2, 3]);
// => false
isEmptyArray([]);
// => true
type
Реалізуйте функцію hasType, яка перевіряє, чи має обʼєкт властивість або метод type.
class Keyboard(){
type(){
// ...
}
}
hasType({ type:"car", color:"red" })
// => true
hasType({ color:"green" })
// => false
hasType(new Keyboard())
// => true
id
Реалізуйте функцію assertHasId, яка викине Error, якщо в обʼєкта немає властивості id.
Якщо ж обʼєкт має властивість id, функція не повинна нічого повертати.
assertHasId({ id: 42, color: 'red' });
// => undefined
assertHasId({ color: 'green' });
// Error: "Object is missing the 'id' property"
id
Реалізуйте функцію hasIdProperty, яка перевіряє, чи має обʼєкт властивість id.
class SimpleData {
constructor() {
this.number = '42';
this.id = 'BC269327FE1D9B95';
}
}
class StealingData extends SimpleData {}
class MethodData {
constructor() {
this.number = '42';
this._id = 'BC269327FE1D9B95';
}
get id() {
return this._id;
}
}
hasIdProperty(new SimpleData());
// => true
hasIdProperty(new MethodData());
// => false
hasIdProperty(new StealingData());
// => false
type
Реалізуйте функцію hasDefinedType, яка перевіряє, чи має обʼєкт властивість type, що не дорівнює undefined.
hasDefinedType({ type: undefined, color: 'red' });
// => false
hasDefinedType({ type: 'car', color: 'green' });
// => true
Зареєструйтеся на Exercism, щоб вивчати й опановувати JavaScript, а також 37 концепцій159 вправ та справжнє наставництво від людей, і все це безкоштовно.