JavaScript – це вільно типізована мова, тому немає ніяких обмежень на тип змінної. Наприклад, якщо створити змінну з типом string, пізніше можна присвоїти цій змінній number:
let message = 'Hello';
message = 15; // okТакий динамізм дає гнучкість, але з іншого боку забирає впевненість, що змінна містить значення певного типу. Наприклад, уявімо що функція greet(name) очікує рядковий аргумент, однак викликати цю функцію можна з будь-яким типом аргументу:
function greet(name) {
return `Hello, ${name}!`;
}
console.log(greet('Jhon')); // Hello, Jhon!
console.log(greet(true)); // Hello, true!
console.log(greet([1])); // Hello, 1!Тож іноді виникає потреба використання таких операторів JavaScript як: typeof (для перевірки типу значення), або instanceof (для перевірки типу екземпляра).
Оператор typeof
typeof у JavaScript – це оператор, який дозволяє визначити тип виразу, що обчислюється до значення, тип якого нам потрібно отримати:
const typeAsString = typeof expression;На місці expression бути змінна, accessor властивості об’єкта, виклик функції, тощо.
Розглянемо приклади роботи оператора typeof у JavaScript:
function greet(name) {
return `Hello, ${name}!`;
}
console.log(typeof greet); // function
console.log(typeof greet('Jhon')); // string
const name = 'Jhon';
console.log(typeof name); // string
const person = {
name: 'Jhon',
age: 30,
};
console.log(typeof person); // objectЯк було показано в попередньому прикладі, typeof об’єкта повертає object, при цьому typeof null також обчислюється як object:
console.log(typeof null); // objectТакож за допомогою typeof можна узнати, чи визначена змінна. Якщо ні – typeof повертає рядок 'undefined'. Тобто typeof myVar === 'undefined' повертає значення true, якщо myVar не визначено:
let name;
console.log(typeof name); // undefined
console.log(typeof name === 'undefined'); // trueОператор instanceof
Функції JavaScript можуть створювати об’єкти:
function Person(name, age) {
this.name = name;
this.age = age;
}
const jhon = new Person('Jhon', 30);
console.log(jhon.name); // Jhonnew Person('Jhon', 30) – це виклик конструктора, що створює екземпляр Person. JavaScript надає можливість перевірити, що певний екземпляр було створено за допомогою певного конструктора. Для цього використовується оператор instanceof:
const jhon = new Person('Jhon', 30);
console.log(jhon instanceof Person); // trueПочинаючи з ES2015, новим способом створення об’єктів є використання синтаксису класів. Перепишемо попередній приклад з використанням класу:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
const jhon = new Person('Jhon', 30);Оскільки jhon було створено за допомогою класу Person, а саме const jhon = new Person('Jhon', 30) – виклик jhon instanceof Person поверне значення true:
const jhon = new Person('Jhon', 30);
console.log(jhon instanceof Person); // trueinstanceof та батьківський клас
Створимо клас Employee, що розширює батьківський клас Person:
class Employee extends Person {
constructor(name, age, job) {
super(name, age);
this.job = job;
}
}
const manager = new Employee('Jhon', 30, 'manager');
console.log(manager instanceof Employee); // trueОчікувано, що manager є екземпляром класу Employee. Але в той же час, manager також є екземпляром базового класу Person:
const manager = new Employee('Jhon', 30, 'manager');
console.log(manager instanceof Person); // trueОтже, object instanceof Constructor повертає значення true, якщо об’єкт є екземпляром Constructor, або ж Constructor є батьківським класом для класу екземпляра.
Підсумок
typeof – це оператор, який дозволяє визначити тип значення, до котрого обчислюється вираз (змінна, accessor властивості об’єкта, виклик функції, тощо). Оператор instanceof дає змогу перевірити, що вказаний екземпляр було створено за допомогою певного конструктора.