На відміну від багатьох інших мов, у JavaScript є дві різні сутності, які позначають відсутність (змістовного) значення.
Це null і undefined.
Примітивне значення null використовують як навмисне «порожнє значення» для змінних будь-якого типу.
let name = null;
// name is intentionally set to "empty" because it is not
// available
Перевірити, чи змінна дорівнює null, можна за допомогою оператора строгої рівності ===.
let name = null;
name === null;
// => true
Змінна, якій не присвоєно значення, має тип
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 ми будемо працювати над системою відстеження квитків, яка допомагає запобігати підробкам. Насамкінець ми допоможемо адаптувати систему до нових законодавчих вимог.
Коли відвідувачі вперше приходять до парку розваг, їм потрібно зареєструватися: ввести своє імʼя та вік у терміналі й погодитися з умовами користування.
Звісно, їм також потрібно купити квиток.
Кожен квиток має ідентифікатор, наприклад H32AZ123.
Напишіть функцію createVisitor, яка приймає три аргументи.
Функція повинна повернути обʼєкт, який містить цю інформацію.
Ключі в обʼєкті мають називатися name, age і ticketId.
createVisitor('Verena Nardi', 45, 'H32AZ123');
// => { name: 'Verena Nardi', age: 45, ticketId: 'H32AZ123' }
Коли люди залишають парк розваг, їхній квиток відкликають. Якщо вони повертаються, їм потрібно купити новий. Щоб заощадити час постійним відвідувачам, їм потрібно зареєструватися лише один раз, і інформація про відвідувача зберігається для наступних відвідувань.
Це означає, що коли відвідувач залишає парк, потрібно зробити недійсним лише його квиток, а решта обʼєкта відвідувача має залишитися незмінною.
Реалізуйте функцію revokeTicket, яка приймає обʼєкт відвідувача, встановлює ідентифікатор квитка в null і після цього повертає обʼєкт.
const visitor = {
name: 'Verena Nardi',
age: 45,
ticketId: 'H32AZ123',
};
revokeTicket(visitor);
// => { name: 'Verena Nardi', age: 45, ticketId: null }
Щоб запобігти підробкам, ідентифікатори квитків унікальні. Щойно квиток друкують, його ідентифікатор додають як ключ до обʼєкта в системі, щоб його можна було відстежувати.
Перш ніж квиток продадуть відвідувачу, його зберігають зі значенням 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'
Через деякий час ми отримуємо відгук від працівників: вони хочуть, щоб статус квитка було легше зрозуміти з першого погляду. Вони хочуть бачити лише імʼя відвідувача або те, що квиток недійсний.
Напишіть функцію 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 !!!'
Через нові законодавчі вимоги новостворені обʼєкти відвідувачів тепер також містять докладну інформацію про «Загальні умови та положення» (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
Зареєструйтеся на Exercism, щоб вивчати й опановувати JavaScript, а також 37 концепцій159 вправ та справжнє наставництво від людей, і все це безкоштовно.