Оператор опциональной цепочки (?.) ES11

Допустим, есть такая вёрстка:

Код
<div class="box"></div>

А в файле скрипта мы пытаемся получить два элемента: существующий блок с классом .box и не существующий блок с классом .block

Код
const box = document.querySelector('.box');
const block = document.querySelector('.block');

Что будет, если мы сейчас попробуем вывести в консоль block?

Код
console.log(block);

Мы, конечно же, получим ошибку в 6-й строке

Цитата
null

Если далее в коде мы попытаемся получить текстовый контент изнутри элемента block, а следующей строкой выполнить еще какой-то код, например, просто вывести в консоль какой-то текст

Код
console.log(block);

console.log(block.textContent);

console.log('Привет!');

Сначала мы получим null в первой строке, а затем получим в 3-й строке ошибку, результата же 5-й строки мы не получим вообще, потому как ошибка в 3-й строке остановила выполнение дальнейшего кода.

Чтобы избежать подобных ситуаций, когда из-за ошибки ломается весь дальнейший код, можно, как вариант, использовать условие (стр.6), например:

Код
const box = document.querySelector('.box');
const block = document.querySelector('.block');

console.log(block)

if (block) {
  console.log(block.textContent);
}

console.log('Привет!');

И вот теперь, если, к примеру, элемента block не существует, мы не получим ошибку и дальнейший код выполнится и мы увидим в консоли null и потом "Привет"

Цитата
null
Привет!

Гораздо удобнее использовать оператор опциональной цепочки (обозначается как ?), он проверяет выражение слева от себя и останавливает операции, если оно имеет значение null или undefined, при этом как результат возвращает undefined, не выдавая при этом ошибки.

Код
console.log(block?.textContent); // undefined

Это работает на чтение свойства, если попробовать записать туда что-то, то мы получим ошибку, потому что в левой части как результат работы оператора ? мы получили undefined, а в него мы, само собой, ничего записать не можем:

Код
block?.textContent = '123';

Часто данные, приходящие, к примеру, от пользователя, либо с сервера, не содержат того, что мы предполагаем.

Например, у нас есть переменная userData, в которой есть какие-то данные

Код
const userData = {
  name: 'Alex',
  age: null
};

Мы, предполагая, что в этом объекте есть свойство skills, а в нём еще js, пытаемся это получить и получаем ошибку:

Код
console.log(userData.skills.js);

Раньше, чтобы избежать возможных ошибок с недостающими данными, прописывали условия, пытаясь предугадать все возможные ошибки, что-то вроде:

Код
if (userData && userData.skills && userData.skills.js) {
  console.log(userData.skills.js);
}

Такие большие проверки теперь вполне можно заменять на проверку с помощью оператора опциональной цепочки, который проверит выражение слева от себя и в зависимости от результата проверки либо выдаст undefined и остановит код, либо код пойдёт дальше:

Код
console.log(userData.skills?.js); // undefined
console.log(userData?.skills?.js); // undefined

Использование оператора при вызове потенциально несуществующего метода объекта:

Код
const userData = {
  name: 'Alex',
  age: null,
  say: function() {
  console.log('Hello');
  }
};

userData.say(); // Hello
userData.hey?.(); // undefined

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

Ссылка на исходникиДокументация

Всего комментариев: 0

Имя *:
Email *:
Код *:
Хостинг от uCoz