Нулевой оператор объединения ( ?? )
Это логический оператор, который возвращает свой правый операнд, когда его левый операнд равен null
или undefined
, а в противном случае возвращает свой левый операнд.
давайте рассмотрим некоторые варианты использования, с которыми вы можете часто сталкиваться, когда оператор ( ?? ) может облегчить вашу жизнь :)
Наиболее распространенный вариант использования — доступ к значению из вложенного Object в javascript.
Во фрагменте кода 1.1 видно, что мы пытаемся получить доступ к ключу «name» из объекта данных, который является вложенным объектом, и это дает нам ожидаемый результат.
Во фрагменте кода 1.2 видно, что теперь вложенный объект данных не содержит ключа 'name'.И когда мы пытаемся получить доступ к 'name ' из него мы получаем undefined.
Получение неопределенного значения часто нежелательно. Возможно, вы захотите установить значение по умолчанию, если ключ, к которому вы пытаетесь получить доступ, иногда не определен.
Это можно решить с помощью логического оператора «ИЛИ» ( || ), например:
console.log(data.profile.name || 'Джон Доу')
Это гарантирует, что если data.profile.name не определено, то отображается John Doe. Но это все еще не идеально,давайте посмотрим почему,
Что, если начальное значение keyage’ равно 0 (что на самом деле является допустимым возрастом). В этом случае на выходе мы получим 21. Что снова не является желаемым поведением.
Это происходит потому, что 0 в javascript считается значением falsy.
Итак, до сих пор нам приходилось делать следующее:
if(data.profile.name == undefined || data.profile.name == null )
{ оставьте значение имени как «Джон Доу»}
else{сохранить предоставленное значение имени}
Это делает ваш код излишне длинным, и многие неопытные программисты (включая меня, когда я только начинал! 🤓) неосознанно добавляют ошибки.
#Совет. Неполные знания опаснее, чем их отсутствие.
Но теперь, с введением нулевого оператора объединения ( ?? )вES2020, мы можем сэкономить много время и ошибки!
Все, что нам нужно сделать, это использовать оператор ( ?? ) вместо ( || ), вот и все! И это все, что вам нужно сделать.
Теперь это будет регистрировать 21 только в том случае, если значение age равно nullили undefined. Что мы и ожидаем.
Необязательный оператор цепочки ( ?. )
Оператор дополнительной цепочки ?.
позволяет считывать значение свойства, расположенного глубоко в цепочке связанных объектов, без необходимости проверки правильности каждой ссылки в цепочке.
давайте разберемся с этим на примере,
Из нашего предыдущего опыта мы знаем, что если мы попытаемся получить доступ к ключу, который не существует внутри объекта, мы получим неопределенность. (см. фрагмент кода – 2.1)
Мы пытаемся получить доступ к age (который отсутствует) из объекта data. Следовательно, мы получаем undefined.
А что, если мы попытаемся получить доступ к несуществующему вложенному ключу?
Как вы можете видеть в фрагменте кода — 2.2, мы получим ошибку.
Итак, если у нас есть два уровня неопределенности, то мы получаем ошибку.
Эту проблему можно решить с помощью логического оператора И(&&), например:
console.log(data && data.profile && data.profile.age);
В переводе на слова это означает — если данные существуют — извлеките data.profile — и если data.profile существует — извлеките данные. .profile.age
И теперь мы бы не получили ошибку. Итак, проблема решена? ну подождите секунду!
⚠️ Теперь это хороший обходной путь для решения этой проблемы, но это становится очень неприятным, очень быстро. Только представьте, если у вас есть глубоко вложенный объект и вы хотите получить доступ к ключу, который находится очень глубоко в этом объекте, сколько раз вам придется использовать оператор &&!
Таким образом, чтобы упростить это, теперь мы можем использовать необязательный оператор цепочки ES2020.
Во фрагменте кода 2.3 вы можете увидеть, насколько лаконичен и легко читается наш код, который в противном случае занял бы несколько строк.
Еще одно замечание, которое следует сделать, заключается в том, что мы получаем вывод как undefined. Что по-прежнему намного лучше, чем получение ошибки, и теперь мы также можем справиться с этим, объединив наши знания о Nullish Coalescing ( ?? ) и Необязательная цепочка ( ?. )оператор!
Прокомментируйте ответ на проблему ниже! или твитнуть меня🐦любые вопросы, которые у вас есть!
Спасибо за чтение, и если вам понравился этот блог, пожалуйста, рассмотрите возможность подписки на другие публикации, подобные этой!