Learn JavaScript #7. Логические операторы & оператор нулевого слияния (??).
Логические операторы
Урок был простой и всю информацию я уже знал, поэтому решил уделить внимание только последнему заданию.
Задания
Проверка логина
Напишите код, который будет спрашивать логин с помощью prompt.
Если посетитель вводит "Админ", то prompt запрашивает пароль, если ничего не введено или нажата клавиша Esc - показать "Отменено", в противном случае отобразить "Я вас не знаю".
- Если введён пароль "Я главный", то выводить "Здравствуйте!",
- Иначе - Неверный пароль",
- При отмене - "Отменено".
let login = prompt('Введите логин', ''); if (login === 'Admin') { let password = prompt('Введите пароль', ''); if (password === 'Я главный') { alert('Hello!'); } else if (password === '' || password === 'null') { alert('Отменено'); } else { alert('Неверный пароль!'); } } else if (login === '' || login === null) { alert('Отменено'); } else { alert ('Я вас не знаю'); } // Сделал чисто из спротивного интереса
Оператор нулевого слияния
Оператор нулевого слияния был добавлен недавно и представляет собой два вопросительных знака ??
.
Оператор нулевого слияния обрабатывает null
и undefined
одинаковым образом, поэтому дальше мы будем говорить, что значение "определено", если оно не равняется ни null
, ни undefined
.
Результат выражения a ?? b
будет следующим:
Иначе говоря, оператор ??
возвращает первый аргумент, если он не null/undefined
, иначе второй.
Применение
Как правило, оператор ??
нужен для того, чтобы задать значение по умолчанию для потенциально неопределённой переменной.
Например, здесь мы отобразим user
, если её значение не null/undefined
, в противном случае Anonim
:
let user; alert(user ?? 'Anonim'); // Отобразится Anonim, так как user не существует
А вот пример, когда user присвоено значение:
let user = 'Pupa'; alert(user ?? 'Anonim'); // Отобразится Pupa, так как user существует
Кроме этого, можно записать последовательность из операторов ??
, чтобы получить первое значение из списка, которое не является null/undefined
.
Допустим, у нас есть данные пользователя в переменных firstname
, lastName
, nickName
. Все они могут не существовать, если пользователь решил не вводить соответствующие значение.
Мы хотели бы отобразить имя пользователя, используя одну из этих переменных, или показать "Anonim"
, если все они null/undefined
.
Для этого воспользуемся оператором ??
:
let firstName = null; let lastName = null; let nickName = 'Суперкодер'; // показывает первое значение, которое определено: alert(firstName ?? lastName ?? nickName ?? 'Anonim'); // Суперкодер
Приоритет
Приоритет оператора ??
такой же, как и у ||
. Они оба равны 4 в таблице на MDN.
Это означает, что, как и ||
, оператор нулевого слияния ??
вычисляется до =
и ?
, но после большинства других операций, таких как +
, *
.
Так что, в выражениях такого вида понадобятся скобки:
let height = null; let width = null; // важно: используйте круглые скобки let area = (height ?? 100) * (width ?? 50); alert(area); // 5000, потому что 100*50
Использование ?? вместе с && или ||
По соображениям безопасности JavaScript запрещает использование оператора ?? вместе с && и ||, если приоритет явно не указан при помощи круглых скобок.
Выполнение следующего кода приведёт к синтаксической ошибке:
let x = 1 && 2 ?? 3; // Синтаксическая ошибка
Это, безусловно спорное, ограничение было добавлено в спецификацию языка с целью избежать программные ошибки, когда люди начнут переходить с || на ??.
Используйте скобки, чтобы обойти это ограничение:
let = (1 && 2) ?? 3; // Работает без ошибок
Итого
- Оператор нулевого слияния
??
- это быстрый способ выбрать первое "определённое" значение из списка.
Используется для присвоения переменным значений по умолчанию:
// будет height = 100, если переменная height равна null or undefined height = height ?? 100;
- Оператор
??
имеет очень низкий приоритет, лишь немного выше, чем у?
и=
, поэтому при использовании его в выражении, скорее всего, потребуются скобки - Запрещено использовать вместе с
||
или&&
без явно указанного приоритета, то есть без скобок