W3docs

Операторы JavaScript

Операторы JavaScript используются для присваивания и сравнения значений, арифметических операций и многого другого.

Введение

Оператор принимает одно или несколько значений (своих операндов) и возвращает новое значение. В JavaScript операторы используются для выполнения арифметических действий, сравнения значений, присваивания значений переменным и построения логических условий. В этой главе рассматриваются наиболее часто используемые операторы — присваивания, арифметические, сравнения и конкатенации строк, — объясняется приведение типов, из-за которого некоторые результаты могут удивить, а также приводится справочник по приоритету операторов, чтобы вы знали, что вычисляется первым.

Несколько терминов, используемых на протяжении всей главы:

  • Операнд — значение, с которым работает оператор. В выражении 5 + 3 операндами являются 5 и 3.
  • Унарный оператор — принимает один операнд (например, -x).
  • Бинарный оператор — принимает два операнда (например, x + y).
  • Тернарный оператор — принимает три операнда; в JavaScript есть ровно один такой оператор (?:).

Операторы присваивания

Базовый оператор присваивания = сохраняет значение в переменной. Составные операторы присваивания объединяют арифметическую операцию с присваиванием, поэтому x += 5 является сокращением для x = x + 5.

ОператорПримерЭквивалентно
=x = 5
+=x += 5x = x + 5
-=x -= 5x = x - 5
*=x *= 5x = x * 5
/=x /= 5x = x / 5
%=x %= 5x = x % 5
**=x **= 2x = x ** 2

javascript— editable

Обратите внимание, что = — это присваивание, а не сравнение. Для сравнения значений используйте === или == (см. ниже).

Арифметические операторы в JavaScript

Основные операторы: сложение (+), вычитание (-), умножение (*) и деление (/)

Эти операторы выполняют четыре основные арифметические операции.


javascript— editable

Остаток от деления (%) и возведение в степень (**)

Оператор остатка от деления (%) возвращает остаток от деления — удобен для проверок вроде «является ли это число чётным?» (n % 2 === 0). Оператор возведения в степень (**) возводит число в указанную степень.


javascript— editable

Унарный плюс и минус

- инвертирует знак значения, а унарный + преобразует операнд в число — это быстрый способ превратить числовую строку в число.


javascript— editable

Инкремент (++) и декремент (--)

++ прибавляет 1 к переменной, а -- вычитает 1. Положение оператора важно: префиксная форма (++x) изменяет значение и возвращает новое, тогда как постфиксная форма (x++) сначала возвращает старое значение, а затем изменяет его.


javascript— editable

Операторы сравнения JavaScript

Операторы сравнения всегда возвращают boolean (true или false). Подробнее см. в отдельной главе Операторы сравнения.

Строгое (===) и нестрогое (==) равенство

Строгое равенство (===) возвращает true только тогда, когда оба операнда имеют одинаковый тип и одинаковое значение — оно никогда не преобразует типы. Нестрогое равенство (==) сначала приводит операнды к общему типу, а затем сравнивает, что может давать неожиданные результаты.

Отрицательные формы этих операторов: !== (строгое неравенство) и != (нестрогое неравенство).


javascript— editable
Информация

Предпочитайте === и !==. Строгое сравнение позволяет избежать скрытых преобразований типов, характерных для ==, и делает код предсказуемым. Используйте == только тогда, когда вам намеренно нужно приведение типов (например, value == null совпадает как с null, так и с undefined).

Больше (>), меньше (<) и их формы «или равно»

Эти операторы сравнивают порядок. Также существуют варианты >= (больше или равно) и <= (меньше или равно).


javascript— editable

Сравнение нечисловых значений

При использовании операторов отношения (<, >, <=, >=) JavaScript выполняет приведение типов. Правило: если оба операнда являются строками, они сравниваются посимвольно (в алфавитном порядке); иначе оба операнда преобразуются в числа перед сравнением.

Это объясняет результат, который поначалу выглядит неверным:


javascript— editable

Сравнения с NaN

NaN (Not-A-Number) — это единственное значение, которое не равно ни чему, включая самого себя. Поэтому === NaN никогда нельзя использовать для его обнаружения. Вместо этого используйте Number.isNaN().


javascript— editable

Конкатенация строк и бинарный оператор +

Конкатенация строк

В JavaScript оператор + используется как для числового сложения, так и для конкатенации строк.


javascript— editable

Бинарный + и приведение типов

Когда один из операндов является строкой, JavaScript преобразует другой в строку тоже.


javascript— editable

Лучшие практики конкатенации

Совет

Используйте шаблонные литералы для ясности и чтобы избежать путаницы с числовым сложением.


javascript— editable

Логические, условные и типовые операторы

В JavaScript есть ещё несколько семейств операторов, каждое из которых имеет свою главу. Ниже приведена краткая карта, чтобы вы знали, что они делают и где читать подробнее.

Логические операторы (&&, ||, !)

&& (И), || (ИЛИ) и ! (НЕ) объединяют boolean-условия. && и || также являются операторами короткого замыкания и возвращают один из своих операндов (не всегда boolean), что делает их удобными для значений по умолчанию и защитных проверок. См. Логические операторы.


javascript— editable

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

Тернарный оператор — это компактный аналог if/else, возвращающий значение: условие ? значениеЕслиИстина : значениеЕслиЛожь. См. Условные операторы.


javascript— editable

typeof и instanceof

typeof возвращает строку, называющую тип значения. instanceof проверяет, был ли object создан определённым конструктором — рассматривается в главе Проверка класса: instanceof.


javascript— editable

Приоритет операторов

Когда в выражении смешиваются операторы, приоритет определяет, какой из них выполняется первым, а ассоциативность определяет порядок среди операторов с одинаковым приоритетом. Например, * имеет более высокий приоритет, чем +, поэтому 2 + 3 * 4 равно 14, а не 20.

Ниже приведены распространённые операторы от наивысшего приоритета к наименьшему:

ПриоритетОператорыОписание
Наивысший()Группировка
++ -- (постфикс)Постфиксный инкремент/декремент
! + - ++ -- typeof (префикс)Унарные операторы
**Возведение в степень (правоассоциативно)
* / %Умножение, деление, остаток
+ -Сложение, вычитание
< <= > >= instanceofОператоры отношения
== != === !==Равенство
&&Логическое И
||Логическое ИЛИ
? :Условный (тернарный)
Наименьший= += -=Присваивание (правоассоциативно)

javascript— editable
Информация

Если есть сомнения — добавьте скобки. Они ничего не стоят во время выполнения и делают предполагаемый порядок очевидным для следующего читателя.

Итоги и частые ошибки

  • Используйте === / !==, а не == / != — если только вам специально не нужно приведение типов.
  • '2' < true равно false, потому что операторы отношения преобразуют нестроковые операнды в числа (2 < 1).
  • Сравнение строк — алфавитное, поэтому '10' < '9' равно true, хотя 10 < 9 равно false.
  • Проверяйте NaN с помощью Number.isNaN(x)x === NaN всегда равно false.
  • + перегружен: со строковым операндом он выполняет конкатенацию ('3' + 2 даёт '32'); предпочитайте шаблонные литералы для ясности.
  • x++ возвращает старое значение, ++x — новое.
  • ** и = правоассоциативны; большинство других бинарных операторов — левоассоциативны.
  • Используйте скобки вместо того, чтобы запоминать полную таблицу приоритетов.

Практика

Практика
Какие из следующих утверждений о сравнениях в JavaScript верны?
Какие из следующих утверждений о сравнениях в JavaScript верны?
Was this page helpful?