Треки
/
JavaScript
JavaScript
/
Салабус
/
Перевірка типів
Пе

Перевірка типів у JavaScript

1 вправа

Про концепцію Перевірка типів

Знати, якого типу фрагмент даних, часто дуже важливо, щоб код працював гладко й без помилок.

У Javascript є кілька способів перевірити тип значення або обʼєкта.

Note

Механізми перевірки типів у 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
Advanced

Клас 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
Note

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
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Перевірка типів