Окрім примітивних типів даних, як-от number і string, у JavaScript є ще один важливий тип даних під назвою object.
Обʼєкти - це набори пар ключ-значення.
Тож їх можна використовувати так само, як те, що в інших мовах часто називають мапами або словниками.
В інших мовах усі значення в мапі часто мають бути одного типу даних.
У JavaScript обмежено лише тип ключа: він має бути string.
Значення всередині одного обʼєкта можуть мати різні типи.
Вони можуть бути примітивними типами, як-от числа, але також масивами, іншими обʼєктами чи навіть функціями.
Це робить обʼєкти надзвичайно універсальними, тому вони також є ключовими сутностями для обʼєктно-орієнтованого програмування (ООП) у JavaScript.
Далі ми зосередимося на обʼєктах як на колекціях або мапах. Інші випадки використання обʼєктів ми розглянемо в інших концепціях, наприклад у класах.
Ми створюємо обʼєкт за допомогою фігурних дужок. Можна також одразу додати деякі записи. Для цього спочатку вказуємо ключ, а потім двокрапку і значення.
const emptyObject = {};
const obj = {
favoriteNumber: 42,
greeting: 'Hello World',
useGreeting: true,
address: {
street: 'Trincomalee Highway',
city: 'Batticaloa',
},
fruits: ['melon', 'papaya'],
addNumbers: function (a, b) {
return a + b;
},
};
Кома після останнього запису в JavaScript необовʼязкова.
Може виникнути питання, чому ключі не беруть у лапки, хоча вони мають бути рядками тексту. Це скорочений запис. Якщо ключ відповідає правилам найменування ідентифікаторів у JavaScript, лапки можна опустити. А для ключів зі спеціальними символами в назві потрібно використати звичайний запис рядка тексту (англ. string).
const obj = {
'1keyStartsWithNumber': '...',
'key/with/slashes': '...',
'key-with-dashes': '...',
'key with spaces': '...',
'#&()[]{}èä樹keyWithSpecialChars': '...',
};
Існує два способи отримати значення за заданим ключем: точкова нотація і нотація з квадратними дужками.
const obj = { greeting: 'hello world' };
obj.greeting;
// => hello world
obj['greeting'];
// => hello world
// Bracket notation also works with variables.
const key = 'greeting';
obj[key];
// => hello world
Використання точкової нотації як скорочення має те саме обмеження, що й пропуск лапок. Вона працює, лише якщо ключ відповідає правилам найменування ідентифікаторів.
Додати або змінити значення можна за допомогою оператора присвоєння =.
І знову доступні точкова нотація і нотація з квадратними дужками.
const obj = { greeting: 'hello world' };
obj.greeting = 'Hi there!';
obj['greeting'] = 'Welcome.';
obj.newKey1 = 'new value 1';
obj['new key 2'] = 'new value 2';
const key = 'new key 3';
obj[key] = 'new value 3';
Пару ключ-значення можна видалити з обʼєкта за допомогою ключового слова delete.
const obj = {
key1: 'value1',
key2: 'value2',
};
delete obj.key1;
delete obj['key2'];
Перевірити, чи існує певний ключ в обʼєкті, можна методом hasOwnProperty.
const obj = { greeting: 'hello world' };
obj.hasOwnProperty('greeting');
// => true
obj.hasOwnProperty('age');
// => false
Існує спеціальний цикл for...in, щоб перебрати всі ключі обʼєкта.
const obj = {
name: 'Ali',
age: 65,
};
for (let key in obj) {
console.log(key, obj[key]);
}
// name Ali
// age 65
Щоб уникнути тонких помилок, завжди слід припускати, що цикл for...in обходить ключі в довільному порядку.
Також варто памʼятати, що for...in включає успадковані ключі у свою ітерацію.
У цій вправі ми реалізуємо спосіб відстежувати рекорди для найпопулярнішої гри в місцевому залі ігрових автоматів.
Нам треба реалізувати 5 функцій, здебільшого повʼязаних з роботою з обʼєктом, який зберігає рекорди.
Створіть функцію createScoreBoard, яка створює обʼєкт, що слугує таблицею рекордів.
Ключами цього обʼєкта будуть імена гравців, а значеннями - їхні рахунки.
Для тестування потрібно одразу додати до обʼєкта один запис.
Цей початковий запис повинен містити The Best Ever як імʼя гравця та 1000000 як рахунок.
createScoreBoard();
// returns an object with one initial entry
Щоб додати гравця до таблиці рекордів, визначте функцію addPlayer.
Вона приймає 3 параметри:
Функція повертає той самий обʼєкт таблиці рекордів, який було передано, після додавання нового гравця.
addPlayer({ 'Dave Thomas': 0 }, 'José Valim', 486373);
// => {'Dave Thomas': 0, 'José Valim': 486373}
Якщо гравці порушують правила залу ігрових автоматів, їх вручну видаляють з таблиці рекордів.
Визначте removePlayer, яка приймає 2 параметри:
Ця функція повинна видалити запис указаного гравця з таблиці та повернути таблицю після цього. Якщо гравця взагалі не було в таблиці, з таблицею нічого не повинно статися. Її треба повернути без змін.
removePlayer({ 'Dave Thomas': 0 }, 'Dave Thomas');
// => {}
removePlayer({ 'Dave Thomas': 0 }, 'Rose Fanaras');
// => { 'Dave Thomas': 0 }
Якщо гравець завершує ще одну гру в залі ігрових автоматів, до попереднього рахунку в таблиці додається певна кількість очок.
Реалізуйте updateScore, яка приймає 3 параметри:
Функція повинна повернути таблицю рекордів після оновлення.
updateScore({ 'Freyja Ćirić': 12771008 }, 'Freyja Ćirić', 73);
// => {"Freyja Ćirić", 12771081}
Щопонеділка зал ігрових автоматів веде окрему таблицю рекордів. Наприкінці дня кожен гравець у цій таблиці отримує 100 додаткових очок.
Реалізуйте функцію applyMondayBonus, яка приймає таблицю рекордів.
Функція додає бонусні очки кожному гравцеві, зазначеному в цій таблиці.
Після цього таблиця повертається.
const scoreBoard = {
'Dave Thomas': 44,
'Freyja Ćirić': 539,
'José Valim': 265,
};
applyMondayBonus(scoreBoard);
// => { 'Dave Thomas': 144, 'Freyja Ćirić': 639, 'José Valim': 365 }
Зареєструйтеся на Exercism, щоб вивчати й опановувати JavaScript, а також 37 концепцій159 вправ та справжнє наставництво від людей, і все це безкоштовно.