Иногда нам нужно определить переменную в зависимости от условия.
Например:
let accessAllowed;
let age = prompt('Сколько вам лет?', '');
if (age > 18) {
accessAllowed = true;
} else {
accessAllowed = false;
}
console.log(accessAllowed);
Так называемый «условный» оператор «вопросительный знак» позволяет нам сделать это более коротким и простым способом.
Оператор представлен знаком вопроса ?
. Его также называют «тернарный», так как этот оператор, единственный в своём роде, имеет три аргумента.
Синтаксис:
let result = условие ? значение1 : значение2;
Сначала вычисляется условие
: если оно истинно, тогда возвращается значение1
, в противном случае – значение2
.
Например:
let accessAllowed = (age > 18) ? true : false;
Технически, мы можем опустить круглые скобки вокруг age > 18
. Оператор вопросительного знака имеет низкий приоритет, поэтому он выполняется после сравнения >
.
Этот пример будет делать то же самое, что и предыдущий:
// оператор сравнения "age > 18" выполняется первым в любом случае
// (нет необходимости заключать его в скобки)
let accessAllowed = age > 18 ? true : false;
Но скобки делают код более читабельным, поэтому мы рекомендуем их использовать.
На заметку:
В примере выше вы можете избежать использования оператора вопросительного знака ?
, т.к. сравнение само по себе уже возвращает true/false
:
// то же самое
let accessAllowed = age > 18;
Несколько операторов „?“
Последовательность операторов вопросительного знака ?
позволяет вернуть значение, которое зависит от более чем одного условия.
Например:
let age = prompt('Возраст?', 18);
let message = (age < 3) ? 'Здравствуй, малыш!' :
(age < 18) ? 'Привет!' :
(age < 100) ? 'Здравствуйте!' :
'Какой необычный возраст!';
console.log( message );
Поначалу может быть сложно понять, что происходит. Но при ближайшем рассмотрении мы видим, что это обычная последовательная проверка:
- Первый знак вопроса проверяет
age < 3
. - Если верно – возвращает
'Здравствуй, малыш!'
. В противном случае, проверяет выражение после двоеточия „”:”“, вычисляетage < 18
. - Если это верно – возвращает
'Привет!'
. В противном случае, проверяет выражение после следующего двоеточия „”:”“, вычисляетage < 100
. - Если это верно – возвращает
'Здравствуйте!'
. В противном случае, возвращает выражение после последнего двоеточия –'Какой необычный возраст!'
.
Вот как это выглядит при использовании if..else
:
if (age < 3) {
message = 'Здравствуй, малыш!';
} else if (age < 18) {
message = 'Привет!';
} else if (age < 100) {
message = 'Здравствуйте!';
} else {
message = 'Какой необычный возраст!';
}
Нетрадиционное использование „?“
Иногда оператор «вопросительный знак» ?
используется в качестве замены if
:
let company = prompt('Какая компания создала JavaScript?', '');
(company == 'Netscape') ?
console.log('Верно!') : console.log('Неправильно.');
В зависимости от условия company == 'Netscape'
, будет выполнена либо первая, либо вторая часть после ?
.
Здесь мы не присваиваем результат переменной. Вместо этого мы выполняем различный код в зависимости от условия.
Не рекомендуется использовать оператор вопросительного знака таким образом.
Несмотря на то, что такая запись короче, чем эквивалентная инструкция if
, она менее читабельна.
Вот, для сравнения, тот же код, использующий if
:
let company = prompt('Какая компания создала JavaScript?', '');
if (company == 'Netscape') {
console.log('Верно!');
} else {
console.log('Неправильно.');
}
При чтении глаза сканируют код по вертикали. Блоки кода, занимающие несколько строк, воспринимаются гораздо легче, чем длинный горизонтальный набор инструкций.
Смысл оператора «вопросительный знак» ?
– вернуть то или иное значение, в зависимости от условия. Пожалуйста, используйте его именно для этого. Когда вам нужно выполнить разные ветви кода – используйте if
.
Практика
Покажите знак числа
важность: 2
Используя конструкцию if..else
, напишите код, который получает число через prompt
, а затем выводит в alert
:
1
, если значение больше нуля,-1
, если значение меньше нуля,0
, если значение равно нулю.
Предполагается, что пользователь вводит только числа.
Перепишите ‘if..else’ в ‘?’
важность: 5
Перепишите if..else
с использованием нескольких операторов '?'
.
Для читаемости рекомендуется разбить код на несколько строк.
let message;
if (login == 'Сотрудник') {
message = 'Привет';
} else if (login == 'Директор') {
message = 'Здравствуйте';
} else if (login == '') {
message = 'Нет логина';
} else {
message = '';
}