Что такое тернарный оператор
Перейти к содержимому

Что такое тернарный оператор

  • автор:

?: оператор — тернарный условный оператор

Условный оператор ?: , также называемый тернарным, вычисляет логическое выражение и в зависимости от полученного значения true или false возвращает результат одного из двух соответствующих выражений, как показано в следующем примере.

string GetWeatherDisplay(double tempInCelsius) => tempInCelsius < 20.0 ? "Cold." : "Perfect!"; Console.WriteLine(GetWeatherDisplay(15)); // output: Cold. Console.WriteLine(GetWeatherDisplay(27)); // output: Perfect! 

Как показано в предыдущем примере, синтаксис условного оператора выглядит следующим образом.

condition ? consequent : alternative 

Выражение condition должно принимать значение true или false . Если condition принимает значение true , вычисляется выражение consequent , а результат становится результатом операции. Если condition принимает значение false , вычисляется выражение alternative , а результат становится результатом операции. Вычисляется только выражение consequent или alternative . Условные выражения являются целевыми типами. Это значит, что если известен целевой тип условного выражения, типы consequent и alternative должны быть неявно преобразованы в целевой тип, как показано в следующем примере:

var rand = new Random(); var condition = rand.NextDouble() > 0.5; int? x = condition ? 12 : null; IEnumerable xs = x is null ? new List() < 0, 1 >: new int[] < 2, 3 >; 

Если целевой тип условного выражения неизвестен (например, при использовании var ключевое слово) или типа consequent и alternative должен быть тот же или неявное преобразование одного типа в другой:

var rand = new Random(); var condition = rand.NextDouble() > 0.5; var x = condition ? 12 : (int?)null; 

Условный оператор имеет правую ассоциативность, то есть выражение формы.

a ? b : c ? d : e 
a ? b : (c ? d : e) 

Вы можете использовать следующий мнемонический прием, чтобы запомнить, как оценивается условный оператор:

is this condition true ? yes : no 

Условное выражение REF

Условное выражение ссылочного выражения условно возвращает ссылку на переменную, как показано в следующем примере:

int[] smallArray = [1, 2, 3, 4, 5]; int[] largeArray = [10, 20, 30, 40, 50]; int index = 7; ref int refValue = ref ((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]); refValue = 0; index = 2; ((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]) = 100; Console.WriteLine(string.Join(" ", smallArray)); Console.WriteLine(string.Join(" ", largeArray)); // Output: // 1 2 100 4 5 // 10 20 0 40 50 

Вы можете ref назначить результат условного ссылочного выражения, использовать его в качестве возвращаемого ссылки или передать его в качестве параметра метода , in out или ref readonly в качестве ref параметра метода. Вы также можете назначить результат условного выражения ссылок, как показано в предыдущем примере.

Для условного выражения REF используется следующий синтаксис:

condition ? ref consequent : ref alternative 

Как и условный оператор, выражение условного ссылок оценивает только одно из двух выражений: либо consequent alternative .

В выражении условного consequent ссылок тип и alternative должен быть одинаковым. Условные выражения ссылок не являются целевыми типами.

Условный оператор и оператор if

Если использовать условный оператор вместо оператора if , может получиться более лаконичный код в случаях, когда необходимо условно вычислить значение. В следующем примере иллюстрируются два вида классификации целого числа как положительного или отрицательного:

int input = new Random().Next(-5, 5); string classify; if (input >= 0) < classify = "nonnegative"; >else < classify = "negative"; >classify = (input >= 0) ? "nonnegative" : "negative"; 

Возможность перегрузки оператора

Определяемый пользователем тип не может перегружать условный оператор.

Спецификация языка C#

Спецификации новых функций:

См. также

  • Упрощение условного выражения (правило стиля IDE0075)
  • справочник по C#
  • Операторы и выражения C#
  • Оператор if
  • ?. И? Операторы []
  • ?? и ??= — операторы
  • Ключевое слово ref

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Обратная связь

Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.

Отправить и просмотреть отзыв по

Дополнительные ресурсы

Значок отказа согласно Закону Калифорнии о защите конфиденциальности потребителей (CCPA)

  • Светлая
  • Темная
  • Высокая контрастность
  • Предыдущие версии
  • Блог
  • Участие в доработке
  • Конфиденциальность
  • Условия использования
  • Товарные знаки
  • © Microsoft 2024

JavaScript: Тернарный оператор

Посмотрите на определение функции, которая возвращает модуль переданного числа:

const abs = (number) => < if (number >= 0) < return number; >return -number; >; abs(10); // 10 abs(-10); // 10 

Можно ли записать её лаконичнее? Что-то вроде return ? Для этого справа от return должно быть выражение, но if — это инструкция, а не выражение.

В JavaScript существует конструкция, которая по своему действию аналогична конструкции if-else, но при этом является выражением. Она называется тернарный оператор.

Тернарный оператор — единственный в своем роде оператор, требующий три операнда:

const abs = (number) => < return number >= 0 ? number : -number; >; 

Общий паттерн выглядит так: ? : .

Сокращенный вариант функции abs() , выглядит так:

const abs = (number) => (number >= 0 ? number : -number); 

Обратите внимание на скобки вокруг тернарника. Они не обязательны, но линтер настоятельно рекомендует их ставить, во избежание неоднозначностей.

Давайте перепишем начальный вариант getTypeOfSentence() аналогично:

const getTypeOfSentence = (sentence) => < const lastChar = sentence.slice(-1); if (lastChar === '?') < return 'question'; >return 'normal'; >; 
const getTypeOfSentence = (sentence) => < const lastChar = sentence.slice(-1); return (lastChar === '?') ? 'question' : 'normal'; >; getTypeOfSentence('Hodor'); // normal getTypeOfSentence('Hodor?'); // question 

Если вы помните, в чём сила выражений, то вероятно уже догадались, что тернарный оператор можно вкладывать в тернарный оператор. Не делайте этого 🙂 Такой код тяжело и читать, и отлаживать, это очень плохая практика.

Задание

Реализуйте функцию convertText() , которая принимает на вход строку и, если первая буква не заглавная, возвращает перевернутый вариант исходной строки. Если первая буква заглавная, то строка возвращается без изменений. Если на вход передана пустая строка, функция должна вернуть пустую строку.

convertText('Hello'); // Hello convertText('hello'); // olleh // Не забудьте учесть пустую строку convertText(''); // '' 

Перевернуть строчку можно используя функцию reverse() . В качестве аргумента в неё нужно передать строку, которую мы хотим перевернуть:

const result = reverse('Hello!'); console.log(result); // => !olleH 

Есть разные подходы к решению этой задачи. Возможно, вам пригодится метод toUpperCase() и возможность получения символа из строки (например, str[0] ).

Попробуйте написать два варианта функции: с обычным if-else, и с тернарным оператором.

Подсказки

  • Подумайте какую проверку нужно написать первым делом: проверку заглавности буквы или является ли пустой строка. Что первичнее?

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное

Определения

  • Тернарный оператор — Способ превратить простую условную инструкцию в выражение, например, number >= 0 ? number : -number .

Условный (тернарный) оператор

Условный (тернарный) оператор - единственный оператор в JavaScript, принимающий три операнда: условие, за которым следует знак вопроса (?), затем выражение, которое выполняется, если условие истинно, сопровождается двоеточием (:), и, наконец, выражение, которое выполняется, если условие ложно. Он часто используется в качестве сокращённого варианта инструкции if. else .

Синтаксис

условие ? выражение1 : выражение2

Параметры

Выражение, принимающее значение true или false .

Выражения, значения которых могут принадлежать любому типу.

Описание

Оператор возвращает значение выражения1 , если условие верно, и значение выражения2 в противном случае. Например, чтобы вывести сообщение, текст которого зависит от значения переменной isMember , можно использовать такое выражение:

function getFee(isMember)  return "The fee is " + (isMember ? "$2.00" : "$10.00"); > console.log(getFee(true)); // Выводит в консоль: "$2.00" console.log(getFee(false)); // Выводит в консоль: "$10.00" 

Также можно присваивать значения переменным на основе результатов работы тернарного оператора :

const elvisLives = Math.PI > 4 ? "Да" : "Нет"; console.log(elvisLives); // "Нет" 

Возможны множественные тернарные операции (обратите внимание: условный оператор ассоциативен справа):

const firstCheck = false; const secondCheck = false; const access = firstCheck ? "Доступ запрещён" : secondCheck ? "Доступ запрещён" : "Доступ разрешён"; console.log(access); // выводит в консоль "Доступ разрешён" 

Тернарные операции можно использовать и сами по себе - для выполнения различных операций:

const age = 16; let stop = false; age > 18 ? location.assign("continue.html") : (stop = true); 

Также возможно выполнять несколько операций на каждое сравнение, разделив их запятыми:

const age = 23; let stop = false; age > 18 ? (alert("Хорошо, вы можете продолжить."), location.assign("continue.html")) : ((stop = true), alert("Простите, вы ещё так юны!")); 

При присвоении значения также возможно выполнение более одной операции. В этом случае переменной будет присвоено то значение, которое стоит последним в списке значений, разделённых запятой.

const age = 16; const url = age > 18 ? (alert("Хорошо, вы можете продолжить."), // alert вернёт "undefined", но это будет проигнорировано, потому что // не является последним в списке значений, разделённых запятой "continue.html") // значение будет присвоено, если age > 18 : (alert("Вы слишком молоды!"), alert("Простите :-("), "stop.html"); // значение будет присвоено, если age < 18location.assign(url); // "stop.html" 

Спецификации

Specification
ECMAScript Language Specification
# sec-conditional-operator

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 6 янв. 2024 г. by MDN contributors.

Your blueprint for a better internet.

  • MDN on Mastodon
  • MDN on X (formerly Twitter)
  • MDN on GitHub
  • MDN Blog RSS Feed

Тернарный оператор

Тернарный оператор работает с тремя операндами: одним условием и двумя выражениями. Возвращает первое выражение, если условие истинно и второе, если условие ложно.

Используется как компактная замена условного оператора if . . . else .

Пример

Скопировать ссылку "Пример" Скопировано

 const num = 5console.log(num === 5 ? 'Пять' : 'Не пять')// Пять const num = 5 console.log(num === 5 ? 'Пять' : 'Не пять') // Пять      

Как пишется

Скопировать ссылку "Как пишется" Скопировано

 (A) ? (B) : (C) (A) ? (B) : (C)      

Где A — условие, B — первое выражение, C — второе выражение.

Если первый операнд A вычисляется в истинное выражение true , то оператор вернёт выражение B. Если в false — вернёт выражение C.

Как понять

Скопировать ссылку "Как понять" Скопировано

По механике работы тернарный оператор похож на инструкцию if . . . else , но позволяет писать меньше кода и записывать результат работы сразу в переменную.

В качестве примера преобразуем код, который использует инструкцию if . . . else :

 const num = 10let result if (num > 10)  result = 'Число больше 10'> else  result = 'Число меньше или равно 10'> console.log(result) const num = 10 let result if (num > 10)  result = 'Число больше 10' > else  result = 'Число меньше или равно 10' > console.log(result)      

Заменим условную конструкцию тернарным оператором:

 const num = 10const result = num > 10 ? 'Число больше 10' : 'Число меньше или равно 10'console.log(result) const num = 10 const result = num > 10 ? 'Число больше 10' : 'Число меньше или равно 10' console.log(result)      

Код сократился и стал устанавливать значение переменной num сразу при объявлении. Это позволило использовать const вместо let .

Тернарный оператор как выражение

Скопировать ссылку "Тернарный оператор как выражение" Скопировано

Тернарный оператор возвращает результат, его можно записать в переменную, как в примере выше, или вернуть с помощью return из функции:

 const salutation = function(name)  return name ? `Рад видеть, $!` : 'Привет, друг!'> console.log(salutation('Дока Дог'))// 'Рад видеть, Дока Дог!'console.log(salutation())// 'Привет, друг!' const salutation = function(name)  return name ? `Рад видеть, $name>!` : 'Привет, друг!' > console.log(salutation('Дока Дог')) // 'Рад видеть, Дока Дог!' console.log(salutation()) // 'Привет, друг!'      

Так как результат работы тернарного оператора можно записать в переменную, то смело делаем вывод, тернарный оператор — выражение. Подробнее о разнице между выражениями и инструкциями читайте в отдельной статье.

Вложенные тернарные операторы

Скопировать ссылку "Вложенные тернарные операторы" Скопировано

Внутри одного тернарного оператора можно написать другой:

 const num = 10const result = num > 10 ? 'Число больше 10' : num === 10 ? 'Число равно 10' : 'Число меньше 10'console.log(result)// 'Число равно 10' const num = 10 const result = num > 10 ? 'Число больше 10' : num === 10 ? 'Число равно 10' : 'Число меньше 10' console.log(result) // 'Число равно 10'      

В этом случае запись идентична использованию конструкций if . . . else if . . . else . Сначала проверяется первое условие, если оно ложно, то проверяется второе и так далее. Отступы в примере проставлены для лучшей читаемости конструкции, они не влияют на выполнение кода.

На практике

Скопировать ссылку "На практике" Скопировано

Илья Космачев советует

Скопировать ссылку "Илья Космачев советует" Скопировано

При выборе между if . . . else и тернарным оператором в приоритет нужно ставить читабельность. Код читается чаще, чем пишется, поэтому чем лучше код читается, тем легче его понимать и изменять.

Разберём выбор между тернарным оператором и if . . . else на примерах.

Допустим, нужно по-разному поприветствовать нового и уже зарегистрированного пользователя. Здесь удобно использовать тернарный оператор, так как проверка короткая:

 const greetings = function(isRegistered, userName)  return isRegistered ? `Привет, $!` : 'Привет, незнакомец'> const greetings = function(isRegistered, userName)  return isRegistered ? `Привет, $userName>!` : 'Привет, незнакомец' >      

Когда появляются вложенные тернарные операторы, лучше переходить на if . . . else . Сравните код с тернарным оператором:

 const greetings = function(isRegistered, userName, bePolite)  return isRegistered ? `Привет, $!` : bePolite ? 'Здравствуйте!' : 'Привет, незнакомец'> const greetings = function(isRegistered, userName, bePolite)  return isRegistered ? `Привет, $userName>!` : bePolite ? 'Здравствуйте!' : 'Привет, незнакомец' >      

И код с if . . . else :

 const greetings = function(isRegistered, userName, bePolite)  if (isRegistered)  return `Привет, $!` > else if (bePolite)  return 'Здравствуйте!' > else  return 'Привет, незнакомец' >> const greetings = function(isRegistered, userName, bePolite)  if (isRegistered)  return `Привет, $userName>!` > else if (bePolite)  return 'Здравствуйте!' > else  return 'Привет, незнакомец' > >      

Если же приветствие зависит от роли, то цепочки вложенных тернарных операторов становятся нечитаемыми:

 const greetings = function(role)  return result = role === 'admin' ? 'Приветствую, босс' : role === 'moder' ? 'Приветствую, смотритель порядка' : role === 'user' ? 'Здравствуй, пользователь' : role === 'guest' ? 'Здравствуй, гость' : 'Привет, некто'> const greetings = function(role)  return result = role === 'admin' ? 'Приветствую, босс' : role === 'moder' ? 'Приветствую, смотритель порядка' : role === 'user' ? 'Здравствуй, пользователь' : role === 'guest' ? 'Здравствуй, гость' : 'Привет, некто' >      

Такой код можно улучшить форматированием, но лучше использовать switch :

 const greetings = function(role)  switch (role)  case 'admin': return 'Приветствую, босс' case 'moder': return 'Приветствую, смотритель порядка' case 'user': return 'Здравствуй, пользователь' case 'guest': return 'Здравствуй, гость' default: return 'Привет, некто' >> const greetings = function(role)  switch (role)  case 'admin': return 'Приветствую, босс' case 'moder': return 'Приветствую, смотритель порядка' case 'user': return 'Здравствуй, пользователь' case 'guest': return 'Здравствуй, гость' default: return 'Привет, некто' > >      

+ Развернуть

На собеседовании

Скопировать ссылку "На собеседовании" Скопировано

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *