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;
};Общий паттерн выглядит так: <predicate> ? <expression on true> : <expression on false>.
Сокращенный вариант функции 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Если вы помните, в чём сила выражений, то вероятно уже догадались, что тернарный оператор можно вкладывать в тернарный оператор. Не делайте этого :) Такой код тяжело и читать, и отлаживать, это очень плохая практика.
Задание
Кнопка в приложении работает как переключатель: каждое нажатие меняет состояние на противоположное. Реализуйте функцию flipFlop(str): если строка равна 'flip', вернуть 'flop'; в противном случае вернуть 'flip'.
flipFlop("flip"); // => 'flop'
flipFlop("flop"); // => 'flip'Используйте тернарный оператор.
Полезное
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;
};Общий паттерн выглядит так: <predicate> ? <expression on true> : <expression on false>.
Сокращенный вариант функции 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Если вы помните, в чём сила выражений, то вероятно уже догадались, что тернарный оператор можно вкладывать в тернарный оператор. Не делайте этого :) Такой код тяжело и читать, и отлаживать, это очень плохая практика.
Задание
Кнопка в приложении работает как переключатель: каждое нажатие меняет состояние на противоположное. Реализуйте функцию flipFlop(str): если строка равна 'flip', вернуть 'flop'; в противном случае вернуть 'flip'.
flipFlop("flip"); // => 'flop'
flipFlop("flop"); // => 'flip'Используйте тернарный оператор.
Полезное
Ваше упражнение проверяется по этим тестам
import { expect, test } from "vitest";
import f from "./index.js";
test("ternary operator", () => {
expect(f("flip")).toBe("flop");
expect(f("flop")).toBe("flip");
expect(f("hello")).toBe("flip");
});Решение учителя откроется через:
20:00
