Операторы JavaScript
Операторы JavaScript используются для присваивания и сравнения значений, арифметических операций и многого другого.
Введение
Оператор принимает одно или несколько значений (своих операндов) и возвращает новое значение. В JavaScript операторы используются для выполнения арифметических действий, сравнения значений, присваивания значений переменным и построения логических условий. В этой главе рассматриваются наиболее часто используемые операторы — присваивания, арифметические, сравнения и конкатенации строк, — объясняется приведение типов, из-за которого некоторые результаты могут удивить, а также приводится справочник по приоритету операторов, чтобы вы знали, что вычисляется первым.
Несколько терминов, используемых на протяжении всей главы:
- Операнд — значение, с которым работает оператор. В выражении
5 + 3операндами являются5и3. - Унарный оператор — принимает один операнд (например,
-x). - Бинарный оператор — принимает два операнда (например,
x + y). - Тернарный оператор — принимает три операнда; в JavaScript есть ровно один такой оператор (
?:).
Операторы присваивания
Базовый оператор присваивания = сохраняет значение в переменной. Составные операторы присваивания объединяют арифметическую операцию с присваиванием, поэтому x += 5 является сокращением для x = x + 5.
| Оператор | Пример | Эквивалентно |
|---|---|---|
= | x = 5 | — |
+= | x += 5 | x = x + 5 |
-= | x -= 5 | x = x - 5 |
*= | x *= 5 | x = x * 5 |
/= | x /= 5 | x = x / 5 |
%= | x %= 5 | x = x % 5 |
**= | x **= 2 | x = x ** 2 |
Обратите внимание, что = — это присваивание, а не сравнение. Для сравнения значений используйте === или == (см. ниже).
Арифметические операторы в JavaScript
Основные операторы: сложение (+), вычитание (-), умножение (*) и деление (/)
Эти операторы выполняют четыре основные арифметические операции.
Остаток от деления (%) и возведение в степень (**)
Оператор остатка от деления (%) возвращает остаток от деления — удобен для проверок вроде «является ли это число чётным?» (n % 2 === 0). Оператор возведения в степень (**) возводит число в указанную степень.
Унарный плюс и минус
- инвертирует знак значения, а унарный + преобразует операнд в число — это быстрый способ превратить числовую строку в число.
Инкремент (++) и декремент (--)
++ прибавляет 1 к переменной, а -- вычитает 1. Положение оператора важно: префиксная форма (++x) изменяет значение и возвращает новое, тогда как постфиксная форма (x++) сначала возвращает старое значение, а затем изменяет его.
Операторы сравнения JavaScript
Операторы сравнения всегда возвращают boolean (true или false). Подробнее см. в отдельной главе Операторы сравнения.
Строгое (===) и нестрогое (==) равенство
Строгое равенство (===) возвращает true только тогда, когда оба операнда имеют одинаковый тип и одинаковое значение — оно никогда не преобразует типы. Нестрогое равенство (==) сначала приводит операнды к общему типу, а затем сравнивает, что может давать неожиданные результаты.
Отрицательные формы этих операторов: !== (строгое неравенство) и != (нестрогое неравенство).
Предпочитайте === и !==. Строгое сравнение позволяет избежать скрытых преобразований типов, характерных для ==, и делает код предсказуемым. Используйте == только тогда, когда вам намеренно нужно приведение типов (например, value == null совпадает как с null, так и с undefined).
Больше (>), меньше (<) и их формы «или равно»
Эти операторы сравнивают порядок. Также существуют варианты >= (больше или равно) и <= (меньше или равно).
Сравнение нечисловых значений
При использовании операторов отношения (<, >, <=, >=) JavaScript выполняет приведение типов. Правило: если оба операнда являются строками, они сравниваются посимвольно (в алфавитном порядке); иначе оба операнда преобразуются в числа перед сравнением.
Это объясняет результат, который поначалу выглядит неверным:
Сравнения с NaN
NaN (Not-A-Number) — это единственное значение, которое не равно ни чему, включая самого себя. Поэтому === NaN никогда нельзя использовать для его обнаружения. Вместо этого используйте Number.isNaN().
Конкатенация строк и бинарный оператор +
Конкатенация строк
В JavaScript оператор + используется как для числового сложения, так и для конкатенации строк.
Бинарный + и приведение типов
Когда один из операндов является строкой, JavaScript преобразует другой в строку тоже.
Лучшие практики конкатенации
Используйте шаблонные литералы для ясности и чтобы избежать путаницы с числовым сложением.
Логические, условные и типовые операторы
В JavaScript есть ещё несколько семейств операторов, каждое из которых имеет свою главу. Ниже приведена краткая карта, чтобы вы знали, что они делают и где читать подробнее.
Логические операторы (&&, ||, !)
&& (И), || (ИЛИ) и ! (НЕ) объединяют boolean-условия. && и || также являются операторами короткого замыкания и возвращают один из своих операндов (не всегда boolean), что делает их удобными для значений по умолчанию и защитных проверок. См. Логические операторы.
Условный (тернарный) оператор (?:)
Тернарный оператор — это компактный аналог if/else, возвращающий значение: условие ? значениеЕслиИстина : значениеЕслиЛожь. См. Условные операторы.
typeof и instanceof
typeof возвращает строку, называющую тип значения. instanceof проверяет, был ли object создан определённым конструктором — рассматривается в главе Проверка класса: instanceof.
Приоритет операторов
Когда в выражении смешиваются операторы, приоритет определяет, какой из них выполняется первым, а ассоциативность определяет порядок среди операторов с одинаковым приоритетом. Например, * имеет более высокий приоритет, чем +, поэтому 2 + 3 * 4 равно 14, а не 20.
Ниже приведены распространённые операторы от наивысшего приоритета к наименьшему:
| Приоритет | Операторы | Описание |
|---|---|---|
| Наивысший | () | Группировка |
++ -- (постфикс) | Постфиксный инкремент/декремент | |
! + - ++ -- typeof (префикс) | Унарные операторы | |
** | Возведение в степень (правоассоциативно) | |
* / % | Умножение, деление, остаток | |
+ - | Сложение, вычитание | |
< <= > >= instanceof | Операторы отношения | |
== != === !== | Равенство | |
&& | Логическое И | |
|| | Логическое ИЛИ | |
? : | Условный (тернарный) | |
| Наименьший | = += -= … | Присваивание (правоассоциативно) |
Если есть сомнения — добавьте скобки. Они ничего не стоят во время выполнения и делают предполагаемый порядок очевидным для следующего читателя.
Итоги и частые ошибки
- Используйте
===/!==, а не==/!=— если только вам специально не нужно приведение типов. '2' < trueравноfalse, потому что операторы отношения преобразуют нестроковые операнды в числа (2 < 1).- Сравнение строк — алфавитное, поэтому
'10' < '9'равноtrue, хотя10 < 9равноfalse. - Проверяйте NaN с помощью
Number.isNaN(x)—x === NaNвсегда равноfalse. +перегружен: со строковым операндом он выполняет конкатенацию ('3' + 2даёт'32'); предпочитайте шаблонные литералы для ясности.x++возвращает старое значение,++x— новое.**и=правоассоциативны; большинство других бинарных операторов — левоассоциативны.- Используйте скобки вместо того, чтобы запоминать полную таблицу приоритетов.