В ECMAScript есть несколько логических операторов, которые очень полезны в наших повседневных задачах. Давайте углубимся в это и попробуем понять, как их можно использовать, а также комбинировать с выражениями присваивания.
Тернарный оператор (c ? t : f)
Тернарный оператор был частью языка JavaScript с момента его первого появления.
Оператор берет 3 операнда и размещает их в следующем формате:
? ‹истинный_результат› : ‹ложный_результат›.
const fee = 4; const doble = true; const total = double ? 2*fee : fee;
У нас здесь нет стенографии, и если мы хотим объединить присваивание, то это выглядит так:
var t = true ? 1 : 0;
Нулевой оператор объединения (??)
Бычий объединяющий оператор, также известный как «оператор Элвиса», появился в ECMAScript 2020 (ES11).
Он существует во многих других языках (таких как C# и Kotlin). Конечно, это не только для поклонников прически Элвиса (?:).
Оператор — это логический оператор, который возвращает свой [правый операнд], когда его [левый операнд пустой или неопределенный], и в противном случае возвращает свой [левый операнд].
const name = otherName ?? 'Suzi'; console.log(name); ==> 'Suzi'
Поэтому, если переменная otherName имеет значение null/undefined, переменной name будет присвоено значение «Suzi». В противном случае он получает значение otherName.
const otherName = 'Jimmy'; const name = otherName ?? 'Suzi'; console.log(name); ==> 'Jimmy'
Логическое задание также появилось в ECMAScript 2020. Это дает нам возможность сократить выражение оператора Элвиса. Это называется присваиванием нулевого объединения (??=).
let name = null; name ??= 'Suzi';
В приведенном выше примере имя оценивается как «Сюзи», поскольку переменная имени имеет значение null.
Оператор безопасной навигации (?.)
Оператор безопасной навигации появился в ECMAScript 2020 (ES11).
Мотивация для этого оператора заключалась в том, чтобы дать разработчику возможность доступа к значению свойства, которое находится глубоко в структуре, не будучи уверенным, что оно существует / левый операнд равен нулю. Это помогает избежать необходимости добавлять последовательные явные проверки нулевой безопасности. Оператор существует на других языках, таких как C# и Swift.
В этом формате оператор использует 2 операнда: ‹oprand›?.‹oprand›.
obj.<oparnd>?.<oparnd> obj.<oparnd>?.[expr_oparnd] obj.<func_oparnd>?.(args_oparnd)
В некоторых случаях это выражение будет частью цепочки. Оператор оценивает выражение слева направо: если левый операнд оценивается как нулевое значение, он останавливает выполнение всей цепочки, и выражение замыкается с возвращаемым значением undefined.
const kid = { name: 'Jimmy', age: 11, shoes: { color: 'black', } } const barnd = kid.shirt?.brand; // it will be eveluted to undefined
Другой пример с записью в скобках:
const kid = { name: 'Jimmy', age: 11, toys: ['Buzz','Peppa Pig'], shoes: { color: 'black', } } const x = 0; const barnd = kid.shirt?.[x++]; // x is evaluted to 0, since the [x++] was not executed let toyInIndex = kid.toys?.[0]; // toyInIndex is evaluted to 'Buzz' let toyInIndex = kid.toys?.[111]; // toyInIndex is evaluted to 'undefined'
Поскольку выражение может быть преобразовано в неопределенное, мы можем комбинировать оператор Элвиса.
const kid = { name: 'Jimmy', age: 11, shoes: { color: 'black', } } const barnd = kid.shirt?.brand ?? 'Nike'; // it will be eveluted to 'Nike'