Треки
/
JavaScript
JavaScript
/
Вправи
/
Парк розваг
Парк розваг

Парк розваг

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

Вступ

На відміну від багатьох інших мов, у JavaScript є дві різні сутності, які позначають відсутність (змістовного) значення. Це null і undefined.

Null

Примітивне значення null використовують як навмисне «порожнє значення» для змінних будь-якого типу.

let name = null;
// name is intentionally set to "empty" because it is not
// available

Перевірити, чи змінна дорівнює null, можна за допомогою оператора строгої рівності ===.

let name = null;

name === null;
// => true

Undefined

Змінна, якій не присвоєно значення, має тип undefined.1

Це означає, що хоча null позначає порожнє значення (але все ж значення), undefined позначає цілковиту відсутність значення. 🤯

undefined трапляється в різних контекстах.

  • Якщо змінну оголошено без значення (без ініціалізації), вона дорівнює undefined.
  • Якщо ми намагаємося отримати значення для неіснуючого ключа в обʼєкті, отримуємо undefined.
  • Якщо функція не повертає значення, результатом буде undefined.
  • Якщо аргумент не передано у функцію, він дорівнює undefined, якщо тільки цей аргумент не має типового значення.
let name;
console.log(name);
// => undefined

Перевірити, чи змінна дорівнює undefined, можна за допомогою оператора строгої рівності ===.

let name;

name === undefined;
// => true

Опціональне звʼязування

Якщо ми намагаємося отримати вкладене значення в обʼєкті, але батьківського ключа не існує, JavaScript викине помилку. Щоб легко цього уникнути, до специфікації мови у 2020 році додали опціональне звʼязування. За допомогою оператора опціонального звʼязування ?. можна зробити так, щоб JavaScript звертався до вкладеного ключа лише тоді, коли батьківський ключ не дорівнює null чи undefined. Інакше повертається undefined.

const obj = {
  address: {
    street: 'Trincomalee Highway',
    city: 'Batticaloa',
  },
};

obj.address.zipCode;
// => undefined

obj.residence.street;
// => TypeError: Cannot read property 'street' of undefined

obj.residence?.street;
// => undefined

Нульове обʼєднання

Бувають ситуації, коли треба застосувати типове значення, якщо змінна дорівнює null або undefined (але тільки тоді). Щоб це врахувати, у 2020 році ввели оператор нульового обʼєднання ??. Він повертає правий операнд лише тоді, коли лівий операнд дорівнює null або undefined. Інакше повертається лівий операнд.

let amount = null;
amount = amount ?? 1;
// => 1

amount = 0;
amount = amount ?? 1;
// => 0

[1] Undefined, MDN. (2021). https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined (дата звернення: 4 червня 2021).

Вказівки

Наше завдання - створювати й підтримувати частини IT-системи парку розваг. Зокрема, ми відповідаємо за програму, яка керує відвідувачами та квитками.

Спочатку ми створимо нового відвідувача в системі. Потім ми додамо функцію для відкликання квитка. У завданнях 3 і 4 ми будемо працювати над системою відстеження квитків, яка допомагає запобігати підробкам. Насамкінець ми допоможемо адаптувати систему до нових законодавчих вимог.

1. Створіть нового відвідувача

Коли відвідувачі вперше приходять до парку розваг, їм потрібно зареєструватися: ввести своє імʼя та вік у терміналі й погодитися з умовами користування. Звісно, їм також потрібно купити квиток. Кожен квиток має ідентифікатор, наприклад H32AZ123.

Напишіть функцію createVisitor, яка приймає три аргументи.

  • Імʼя відвідувача.
  • Вік відвідувача.
  • Ідентифікатор квитка, який купив відвідувач.

Функція повинна повернути обʼєкт, який містить цю інформацію. Ключі в обʼєкті мають називатися name, age і ticketId.

createVisitor('Verena Nardi', 45, 'H32AZ123');
// => { name: 'Verena Nardi', age: 45, ticketId: 'H32AZ123' }

2. Відкличте квиток

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

Це означає, що коли відвідувач залишає парк, потрібно зробити недійсним лише його квиток, а решта обʼєкта відвідувача має залишитися незмінною. Реалізуйте функцію revokeTicket, яка приймає обʼєкт відвідувача, встановлює ідентифікатор квитка в null і після цього повертає обʼєкт.

const visitor = {
  name: 'Verena Nardi',
  age: 45,
  ticketId: 'H32AZ123',
};

revokeTicket(visitor);
// => { name: 'Verena Nardi', age: 45, ticketId: null }

3. Визначте статус квитка

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

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

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

  • 'unknown ticket id', якщо ідентифікатор не знайдено в обʼєкті відстеження
  • 'not sold', якщо квиток надрукували, але не продали
  • 'sold to {name}', де {name} - імʼя відвідувача, якщо квиток продали
const tickets = {
  '0H2AZ123': null,
  '23LA9T41': 'Verena Nardi',
};

ticketStatus(tickets, 'RE90VAW7');
// => 'unknown ticket id'

ticketStatus(tickets, '0H2AZ123');
// => 'not sold'

ticketStatus(tickets, '23LA9T41');
// => 'sold to Verena Nardi'

4. Покращте відповідь про статус квитка

Через деякий час ми отримуємо відгук від працівників: вони хочуть, щоб статус квитка було легше зрозуміти з першого погляду. Вони хочуть бачити лише імʼя відвідувача або те, що квиток недійсний.

Напишіть функцію simpleTicketStatus, яка приймає ті самі аргументи, що й ticketStatus у завданні 3. Ця функція повертає лише один із двох різних результатів.

  • імʼя відвідувача, якщо квиток продали
  • 'invalid ticket !!!', якщо квиток ще не продали або ідентифікатора немає в обʼєкті відстеження
const tickets = {
  '0H2AZ123': null,
  '23LA9T41': 'Verena Nardi',
};

simpleTicketStatus(tickets, '23LA9T41');
// => 'Verena Nardi'

simpleTicketStatus(tickets, '0H2AZ123');
// => 'invalid ticket !!!'

simpleTicketStatus(tickets, 'RE90VAW7');
// => 'invalid ticket !!!'

5. Визначте версію загальних умов і положень

Через нові законодавчі вимоги новостворені обʼєкти відвідувачів тепер також містять докладну інформацію про «Загальні умови та положення» (GTC), з якими погодився користувач. Нижче наведено приклад нового обʼєкта відвідувача.

Касирам парку розваг тепер потрібно перевіряти, чи потрібно відвідувачу підписати нову версію GTC. Для цього реалізуйте функцію gtcVersion, яка приймає обʼєкт відвідувача як аргумент і повертає версію GTC, якщо вона доступна. Якщо інформація про версію недоступна, функція не повинна нічого повертати.

const visitorNew = {
  name: 'Verena Nardi',
  age: 45,
  ticketId: 'H32AZ123',
  gtc: {
    signed: true,
    version: '2.1',
  },
};

gtcVersion(visitorNew);
// => '2.1'

const visitorOld = {
  name: 'Verena Nardi',
  age: 45,
  ticketId: 'H32AZ123',
};

gtcVersion(visitorOld);
// => undefined
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
JavaScript Exercism

Час розпочати Парк розваг?

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