Треки
/
JavaScript
JavaScript
/
Вправи
/
Щасливі числа
Щасливі числа

Щасливі числа

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

Вступ

У JavaScript значення можуть бути різних типів. Змінити тип змінної можна за допомогою явного перетворення типу. Крім того, JavaScript також виконує приведення типу (неявне перетворення типу), коли цього вимагає контекст.

Перетворення типу

JavaScript не має конструкції для приведення до (іншого) типу, як багато інших мов, але натомість можна скористатися деякими вбудованими засобами. Зокрема, Boolean, Number і String можна використовувати як функції, щоб перетворити значення на відповідний тип.

Перетворення на булеве значення (правдиві та хибні значення)

За допомогою Boolean(value) можна перетворити будь-яке значення на булеве значення (англ. Boolean). Існує фіксований набір значень, так званих хибних, які перетворюються на false. Найважливіше: false, 0, порожній рядок тексту (англ. string), null, undefined та NaN є хибними.

Для всіх інших значень Boolean повертає true. Такі значення називають правдивими.

Boolean(-1);
// => true

Boolean(0);
// => false

Boolean(' ');
// => true

Boolean('');
// => false

Зауважмо, що через описані правила '0', 'false', [] та {} є правдивими у JavaScript.

Перетворення на число

Number(value) можна використати, щоб перетворити значення на число. Пробільні символи на початку та в кінці рядка тексту ігноруються, а порожній рядок тексту перетворюється на 0. Якщо спробувати перетворити непримітивне значення або рядок тексту, що не є числом, результатом буде NaN (Не число).

Number('  -12.34  ');
// => -12.34

Number('1,2');
// => NaN

Number('');
// => 0

Number({ num: 123 });
// => NaN

Перетворення на рядок тексту

За допомогою String(value) можна перетворити значення на рядок тексту. Для примітивних значень результат буде таким, як ми й очікуємо.

String(12.34);
// => '12.34'

String(false);
// => 'false'

String(null);
// => 'null'

String(undefined);
// => 'undefined'

Для масивів функція String застосує перетворення на рядок тексту до кожного елемента й зʼєднає результати комою. Можна також самостійно застосувати метод join, наприклад, щоб налаштувати роздільник. Зауважмо, що в цих випадках null та undefined перетворюються на порожній рядок тексту.

String([42, null, true, 'abc']);
// => '42,,true,abc'

Для обʼєктів String типово повертає неінформативний текст.

String({ key: 'value' });
// => '[object Object]'

Приведення типу

У певних контекстах JavaScript автоматично перетворює значення на інший тип даних, перш ніж виконати інструкцію. Це неявне перетворення називають приведенням типу.

Булевий контекст

Коли небулеве значення використовується в булевому контексті, JavaScript застосовує ті самі правила, що й функція Boolean, щоб неявно перетворити це значення.

Приведення до булевого значення зазвичай відбувається для

  • умови умовної конструкції
  • першого операнда тернарного оператора ?
  • операнда оператора логічного заперечення !
  • операндів операторів && (логічне і) та || (логічне або) (результат виразу є одним з операндів, не обовʼязково булевим значенням)
const num = 0;
if (num) {
  // this block is NOT executed because 0 is falsy
}

Контекст рядка тексту

Якщо оператор додавання + застосовується до примітивних значень і один з операндів є рядком тексту, інший теж буде приведений до рядка тексту. Логіка перетворення така сама, як під час використання функції String. Після цього два рядки тексту зʼєднуються.

let name;
'hello ' + name;
// => 'hello undefined'

Числовий контекст

Багато операторів приводить операнди до чисел (за потреби) згідно з логікою функції Number, поясненою вище.

  • Арифметичні оператори: + (якщо не задіяно рядок тексту), -, *, /, %, **
  • Оператори унарного плюса та унарного заперечення: +, -
  • Оператори порівняння (для операндів, що не є рядками тексту): >, >=, <, <=
  • Побітові оператори: |, &, ^, ~

Звернімося до списку операторів MDN, щоб дізнатися більше про будь-який з них.

Щоб уникати помилок, добре завжди явно викликати Number перед застосуванням цих операторів.

Вказівки

Наш друг Коjo дуже любить числа. У нього є невеликий сайт під назвою «fun-with-numbers». Коjo не дуже добре володіє програмуванням, тож він попросив нас про допомогу.

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

1. Обчислити суму чисел на гральному автоматі

Одна з ігор на сайті Коjo має вигляд грального автомата, який показує дві групи коліс із цифрами. Кожна група цифр представляє число. Для ігрової механіки Коjo потрібно знати суму цих двох чисел.

Напишіть функцію twoSum, яка приймає два масиви як параметри. Кожен масив складається з одного або кількох чисел від 0 до 9. Функція має інтерпретувати кожен масив як число й повернути суму цих двох чисел.

twoSum([1, 2, 3], [0, 7]);
//=> 130

// [1, 2, 3] represents 123 and [0, 7] represents 7.
// 123 + 7 = 130

2. Визначити, чи є число паліндромом

Ще одна гра на сайті - невелика вікторина під назвою «Щасливі числа». Користувач може ввести число й побачити, чи належить воно до якоїсь таємної послідовності або закономірності. Послідовність або закономірність «щасливих чисел» змінюється щомісяця, і кожен користувач має лише обмежену кількість спроб, щоб її вгадати.

Щасливими числами цього місяця мають бути числа-паліндроми. Числа-паліндроми залишаються тими самими, якщо записати цифри у зворотному порядку.

Реалізуйте нову функцію luckyNumber, яка приймає число як параметр. Функція має повернути true, якщо число є паліндромом, і false в іншому разі. Вхідне число завжди буде додатним цілим числом.

luckyNumber(1441);
//=>  true

luckyNumber(123);
//=> false

3. Створити повідомлення про помилку для некоректних вхідних даних користувача

У різних місцях сайту є поля введення, де користувачі можуть вводити числа й натискати кнопку, щоб викликати якусь дію. Коjo хоче покращити досвід користування своїм сайтом. Він хоче показувати повідомлення про помилку, якщо користувач натискає кнопку, а поле містить некоректне вхідне значення.

Ось трохи більше інформації про те, як надається значення поля введення.

  • Якщо користувач вводить щось у поле, повʼязане значення завжди є рядком тексту (англ. string), навіть якщо він ввів лише цифри.
  • Якщо користувач щось вводить, а потім стирає, змінна буде порожнім рядком тексту.
  • Ще до того, як користувач почне вводити, змінна може бути undefined або null.

Напишіть функцію errorMessage, яка приймає введені користувачем дані як параметр. Якщо користувач не надав жодних вхідних даних, errorMessage має повернути 'Required field'. Якщо вхідні дані не є числом, відмінним від нуля (згідно з правилами перетворення JavaScript), потрібно повернути 'Must be a number besides 0'. В усіх інших випадках можемо вважати вхідні дані коректними, і тоді поверненим значенням має бути порожній рядок тексту.

errorMessage('123');
// => ''

errorMessage('');
// => 'Required field'

errorMessage('abc');
// => 'Must be a number besides 0'
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
JavaScript Exercism

Час розпочати Щасливі числа?

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