Кроме арифметических операций со школы нам известны операции сравнения. Например, 5 > 4
. Это звучит как вопрос: «5 больше 4?». В данном случае ответ «да». В других случаях ответом может быть «нет», например, для 3 < 1
.
Операции сравнения не имеют привязки к числам. Сравнивать можно практически все что угодно, например, строки. Каждый раз, когда мы входим на какой-то сайт, внутри происходит сравнение введенных логина и пароля с теми, какие есть в базе. И только если они есть, нас авторизируют.
Языки программирования адаптировали все математические операции сравнения практически в неизменном виде. Единственное серьезное отличие – операторы равенства и неравенства. В математике для этого используется обычное равно =
, но в программировании такое встречается не часто. Во многих языках символ =
используется для присваивания значений переменным, поэтому для сравнения взяли ==
или ===
.
Список операций сравнения в JavaScript:
<
меньше<=
меньше или равно>
больше>=
больше или равно===
равно!==
не равно
Небольшая ремарка: для равенства и неравенства также существуют операторы ==
и !=
, которые мы не будем использовать из-за потенциальной опасности. Мы поговорим об этом в будущих уроках.
Логический тип
Логическая операция типа 5 > 4
или password === text
— это выражение, и его результат — специальное значение true
(«истина») или false
(«ложь»). Это новый для нас тип данных — boolean. Он содержит всего лишь два этих значения.
const result = 5 > 4
console.log(result) // => true
console.log('one' !== 'one') // => false
Наряду со строками (string), целыми и рациональными числами (number), логический тип (boolean) — это один из примитивных типов данных в JavaScript.
Попробуем написать примитивную функцию, которая принимает на вход возраст ребенка и определяет, младенец ли он. Младенцами считаются дети до года:
const isInfant = age => age < 1
Пользуемся тем фактом, что любая операция — это выражение, поэтому единственной строчкой функции пишем «вернуть то значение, которое получится в результате сравнения age < 1
».
В зависимости от пришедшего аргумента, сравнение будет либо истинным (true
), либо ложным (false
), и return
вернет этот результат.
const isInfant = age => age < 1
isInfant(3) // false
А теперь проверим ребенка, которому полгода:
isInfant(0.5) // true
Предикаты
Функции, подобные isInfant()
, называют предикатами. Функции-предикаты (или функции-вопросы) отвечают на какой-то вопрос и всегда (без исключений!) возвращают либо true
, либо false
.
Предикаты во всех языках принято именовать особым образом для простоты анализа. В JavaScript предикаты, как правило, начинаются с префикса is
, has
или can
, но не ограничены этими словами. Примеры:
isInfant()
— «младенец ли?»hasChildren()
— «есть ли дети?»isEmpty()
— «пустой ли?»hasErrors()
— «есть ли ошибки?»
Функция может считаться предикатом только если она возвращает boolean.
Давайте напишем еще одну функцию-предикат. Она принимает строку и проверяет, является ли она словом 'Castle'
:
const isCastle = type => type === 'Castle'
isCastle('Sea') // false
Комбинирование логических операций
Логические операции — это выражения. Значит, логические операции можно комбинировать с другими выражениями.
Например, мы хотим проверить четность числа, то есть кратность двум. В программировании используют такой подход:
- проверяют остаток от деления на 2:
- если остаток 0, то число было четным
- если остаток не 0, то число было нечетным
Остаток от деления — простая, но очень важная концепция в арифметике, алгебре, и даже в теории чисел и криптографии. Идея проста: нужно разделить число на несколько равных групп, и если в конце что-то останется — это и есть остаток от деления.
Делим конфеты поровну между людьми:
- 7 конфет, 2 человека: 2 x 3 + остаток 1. Значит, 7 не кратно 2.
- 21 конфету, 3 человека: 3 x 7 + остаток 0. Значит, 21 кратно 3.
- 19 конфет, 5 человек: 5 x 3 + остаток 4. Значит, 19 не кратно 5.
Оператор %
вычисляет остаток от деления (не путайте с делением):
7 % 2 // 1
21 % 3 // 0
19 % 5 // 4
// Проверка четности
10 % 2 // 10 четное, так как остаток 0
9 % 2 // 9 нечетное, так как остаток 1
Напишем функцию проверки четности:
const isEven = number => number % 2 === 0
isEven(10) // true
isEven(3) // false
В одном выражении мы скомбинировали логический оператор ===
(проверка равенства) и арифметический оператор %
.
Приоритет арифметических операций выше логических. Значит, сначала вычисляется арифметическое выражение number % 2
, затем результат участвует в логическом сравнении.
Словами это можно расшифровать так: «вычислить остаток от деления числа number
на 2 и сравнить, равен ли остаток нулю; затем вернуть результат проверки равенства».
Другой пример: напишем функцию, которая принимает строку и проверяет, заглавная ли первая буква.
Алгоритм:
- Получим и запишем в константу первый символ из строки-параметра
- Сравним, равен ли символ своей большой (заглавной) версии
- Вернем результат
const isFirstLetterInUpperCase = (string) => {
const firstLetter = string[0]
return firstLetter.toUpperCase() === firstLetter
}
isFirstLetterInUpperCase('marmont') // false
isFirstLetterInUpperCase('Robb') // true