JavaScript - Опциональнаяцепочка

Здравствуйте, будущие маги JavaScript! ? Сегодня мы отправимся в увлекательное путешествие в мир опциональной цепочки (Optional Chaining). Не волнуйтесь, если вы новички в программировании - я буду вашим доброжелательным гидом, и мы будем двигаться шаг за шагом. К концу этого урока вы будете.chain как профи! Погружаемся!

JavaScript - Optional Chaining

Проблема с несуществующими свойствами

Представьте, что вы пытаетесь найти книгу в огромной библиотеке. Вы знаете, что она должна быть в секции "Научная фантастика" на третьем этаже, в заднем углу. Но что, если в библиотеке даже нет третьего этажа? Или что, если нет секции "Научная фантастика"? Это та проблема, с которой мы часто сталкиваемся в JavaScript при работе с вложенными объектами.

Давайте рассмотрим пример:

const library = {
fiction: {
fantasy: {
books: ['The Hobbit', 'Harry Potter']
}
}
};

console.log(library.fiction.sciFi.books);

Если вы запустите этот код, вы получите ошибку: "Cannot read property 'books' of undefined". Почему? Потому что library.fiction.sciFi не существует! Вот где на помощь приходит опциональная цепочка.

Что такое опциональная цепочка в JavaScript?

Опциональная цепочка - это как сетка безопасности для вашего кода. Она позволяет вам доступа к вложенным свойствам объектов, не беспокоясь о том, существуют ли промежуточные свойства. Она обозначается оператором ?..

Давайте перепишем наш предыдущий пример с использованием опциональной цепочки:

const library = {
fiction: {
fantasy: {
books: ['The Hobbit', 'Harry Potter']
}
}
};

console.log(library.fiction.sciFi?.books);

Теперь вместо выброса ошибки это просто вернет undefined. Это как будто вы говорите: "Если существует sciFi, дайте мне его books. Если нет, не волнуйтесь!"

Опциональная цепочка с вызовами функций

Опциональная цепочка не только для свойств объектов. Вы можете использовать ее и с вызовами функций! Давайте представим, что у нас есть библиотечная система, где книги можно брать в прокат:

const library = {
fiction: {
fantasy: {
checkOut: function(book) {
console.log(`Берём в прокат ${book}`);
}
}
}
};

library.fiction.fantasy.checkOut?.('The Hobbit');
library.fiction.sciFi?.checkOut?.('Dune');

В этом примере "The Hobbit" будет взят в прокат, но с "Dune" ничего не произойдет, потому что sciFi не существует. Никаких ошибок, просто гладкое плавание!

Опциональная цепочка с выражениями

Вы также можете использовать опциональную цепочку с квадратной скобкой. Это полезно, когда имена ваших свойств динамичны или содержат специальные символы:

const users = {
'123': { name: 'Alice', age: 30 },
'456': { name: 'Bob', age: 25 }
};

const userId = '789';
console.log(users[userId]?.name);

Это вернет undefined, потому что нет пользователя с ID '789', но не выбросит ошибку.

Опциональная цепочка с оператором "delete"

Оператор delete также можно использовать с опциональной цепочкой. Это полезно, когда вы хотите удалить свойство, которое может не существовать:

const obj = {
prop: {
innerProp: 'value'
}
};

delete obj.prop?.innerProp;
delete obj.nonExistent?.prop;

Первое delete работать как预期, удаляя innerProp. Второе не сделает ничего, но не выбросит ошибку.

Короткое замыкание с опциональной цепочкой

Опциональная цепочка имеет полезную функцию called короткое замыкание. Если левая часть ?. равна null или undefined, оценка останавливается и возвращает undefined:

const obj = null;
console.log(obj?.prop?.subProp);  // Возвращает undefined

Это super полезно для избежания надоедливых ошибок "Cannot read property of null"!

Оператор nullish coalescing с опциональной цепочкой

Оператор nullish coalescing (??) работает отлично с опциональной цепочкой. Он позволяет вам указать значение по умолчанию, если результат опциональной цепочки равен null или undefined:

const user = {
name: 'Alice',
details: {
age: 30
}
};

console.log(user.details?.job ?? 'безработный');  // Возвращает 'безработный'
console.log(user.details?.age ?? 'неизвестно');     // Возвращает 30

Это идеально для предоставления значений по умолчанию, когда свойства могут не существовать.

Вот таблица, резюмирующая методы, которые мы рассмотрели:

Метод Синтаксис Описание
Доступ к свойствам obj?.prop Безопасный доступ к вложенным свойствам объектов
Вызов функции func?.() Безопасный вызов функции, которая может не существовать
Выражение obj?.[expr] Безопасный доступ к свойствам с динамическими или специальными именами
Оператор delete delete obj?.prop Безопасное удаление свойства, которое может не существовать
Короткое замыкание obj?.prop?.subProp Остановка оценки, если любая часть равна null или undefined
С опциональной цепочкой и оператором nullish coalescing obj?.prop ?? defaultValue Указание значения по умолчанию для null или undefined результатов

И вот оно, folks! Вы только что повысили свои навыки JavaScript с помощью опциональной цепочки. Помните, программирование как конструирование из LEGO - начните с основ, и перед тем как вы это осознаете, вы будете создавать шедевры. Продолжайте практиковаться, stay curious, и счастливого кодирования! ??‍??‍?

Credits: Image by storyset