Треки
/
JavaScript
JavaScript
/
Вправи
/
Робот для переробки
Робот для переробки

Робот для переробки

Навчальна вправа

Вступ

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

У 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 не працюватиме з масивом, створеним в іншому середовищі, наприклад в 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
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

Вказівки

Інструкції

Нас найняв центр переробки. Через брак місця всі продукти кладуть на один конвеєр, але через це різні матеріали змішуються між собою й стають непридатними. Щоб це виправити, нам доручили створити функції, які визначають тип продукту.

1. Перевірити, чи значення є булевим

Реалізуйте функцію isBoolean, яка перевіряє, чи є значення булевим (англ. Boolean).

isBoolean(true);
// => true

isBoolean(null);
// => false

2. Перевірити, чи значення є числом.

Реалізуйте функцію isNumber, яка перевіряє, чи є значення скінченним number або bigint, тобто не NaN і не Infinity.

Іноді пристрій для зчитування ідентифікаторів дає збій і зчитує нечислове значення як NaN (не число) або Infinity. Наша функція також повинна правильно це обробляти.

isNumber(42);
// => true

isNumber('Hello, World!');
// => false

isNumber(42n);
// => true

isNumber(NaN);
// => false

3. Перевірити, чи значення є обʼєктом

Реалізуйте функцію isObject, яка повинна перевіряти, чи є значення обʼєктом. На конвеєрі null не означає нічого, і його не вважають обʼєктом.

isObject({ greeting: 'Hello' });
// => true

isObject(25n);
// => false

4. Перевірити, чи рядок тексту є числовим

Реалізуйте функцію isNumericString, яка повинна перевіряти, чи є значення рядком тексту (англ. string), що складається лише з цифр або з мінуса й цифр після нього, які позначають відʼємне число. Розглядаємо лише цілі числа: десяткові числа не вважаються числовими для цієї перевірки робота-переробника.

isNumericString(42);
// => false

isNumericString('42');
// => true

isNumericString('Hi!');
// => false

5. Перевірити, чи обʼєкт є електронним

Реалізуйте функцію isElectronic, яка перевіряє, чи є обʼєкт екземпляром наданого класу ElectronicDevice або одного з його дочірніх класів.

class Duck {
  //...
}

class WashingMachine extends ElectronicDevice {
  //...
}

isElectronic(new Duck());
// => false

isElectronic(new WashingMachine());
// => true

6. Перевірити, чи значення є непорожнім масивом

Реалізуйте функцію isNonEmptyArray, яка перевіряє, чи є значення непорожнім масивом.

isNonEmptyArray([1, 2, 3]);
// => true

isNonEmptyArray([]);
// => false

7. Перевірити, чи значення є порожнім масивом

Реалізуйте функцію isEmptyArray, яка перевіряє, чи є значення порожнім масивом.

isEmptyArray([1, 2, 3]);
// => false

isEmptyArray([]);
// => true

8. Перевірити, чи має обʼєкт властивість або метод type

Реалізуйте функцію hasType, яка перевіряє, чи має обʼєкт властивість або метод type.

class Keyboard(){
  type(){
    // ...
  }
}
hasType({ type:"car", color:"red" })
// => true

hasType({ color:"green" })
// => false

hasType(new Keyboard())
// => true

9. Викинути помилку, якщо обʼєкт не має властивості або методу id

Реалізуйте функцію assertHasId, яка викине Error, якщо в обʼєкта немає властивості id.

Якщо ж обʼєкт має властивість id, функція не повинна нічого повертати.

assertHasId({ id: 42, color: 'red' });
// => undefined

assertHasId({ color: 'green' });
// Error: "Object is missing the 'id' property"

10. Перевірити, чи має обʼєкт властивість 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

11. Перевірити, чи має обʼєкт визначену властивість type

Реалізуйте функцію hasDefinedType, яка перевіряє, чи має обʼєкт властивість type, що не дорівнює undefined.

hasDefinedType({ type: undefined, color: 'red' });
// => false

hasDefinedType({ type: 'car', color: 'green' });
// => true
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
JavaScript Exercism

Час розпочати Робот для переробки?

Зареєструйтеся на Exercism, щоб вивчати й опановувати JavaScript, а також 37 концепцій159 вправ та справжнє наставництво від людей, і все це безкоштовно.