38 lines
2.3 KiB
Markdown
38 lines
2.3 KiB
Markdown
---
|
||
sidebar_position: 5
|
||
---
|
||
|
||
# Опциональная цепочка '?.'
|
||
Опциональная цепочка ?. останавливает вычисление и возвращает `undefined`, если значение перед ?. равно `undefined` или `null`.
|
||
```js
|
||
let user = {}; // пользователь без адреса
|
||
|
||
alert( user?.address?.street ); // undefined (без ошибки)
|
||
```
|
||
### Другие варианты применения: ?.(), ?.[]
|
||
Опциональная цепочка ?. — это не оператор, а специальная синтаксическая конструкция, которая также работает с функциями и квадратными скобками.
|
||
|
||
Например, ?.() используется для вызова функции, которая может не существовать.
|
||
|
||
❗ ***Мы можем использовать ?. для безопасного чтения и удаления, но не для записи***
|
||
|
||
Опциональная цепочка ?. не имеет смысла в левой части присваивания.
|
||
```js
|
||
let user = null;
|
||
|
||
user?.name = "John"; // Ошибка, не работает
|
||
// то же самое что написать undefined = "John"
|
||
```
|
||
|
||
## Итого
|
||
Синтаксис опциональной цепочки ?. имеет три формы:
|
||
|
||
1. **obj?.prop** – возвращает ***obj.prop*** если `obj` существует, в противном случае `undefined`.
|
||
2. **obj?.[prop]** – возвращает ***obj[prop]*** если `obj` существует, в противном случае `undefined`.
|
||
3. **obj.method?.()** – вызывает ***obj.method()***, если obj.method существует, в противном случае возвращает `undefined`.
|
||
|
||
Как мы видим, все они просты и понятны в использовании. ?. проверяет левую часть на `null/undefined` и позволяет продолжить вычисление, если это не так.
|
||
|
||
Цепочка ?. позволяет безопасно получать доступ к вложенным свойствам.
|
||
|
||
🚀 **Источник: [https://learn.javascript.ru/optional-chaining](https://learn.javascript.ru/optional-chaining)** |