July 21, 2022

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 будет следующим:

  • если a определено, то a,
  • если a не определено, то b. (То есть a = null или undefined)

Иначе говоря, оператор ?? возвращает первый аргумент, если он не 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;
  • Оператор ?? имеет очень низкий приоритет, лишь немного выше, чем у ? и =, поэтому при использовании его в выражении, скорее всего, потребуются скобки
  • Запрещено использовать вместе с || или && без явно указанного приоритета, то есть без скобок

Telegram-канал: unknown.dev