JavaScript: Операторы
Оператор – это символ(ы) или ключевое слово, благодаря которому производятся некоторые виды вычислений с участием одного или нескольких значений. Значения, располагающиеся слева и справа от оператора, называются операндами. Оператор с одним операндом называется унарным, с двумя – бинарным, с тремя – тернарным.
Операторы могут автоматически преобразовывать типы своих операндов по мере необходимости. Например, оператор умножения *
ожидает получить числа, поэтому выражение "2" * "3"
считается вполне допустимым благодаря тому, что интерпретатор выполнит неявное преобразование строк в числа.
Приоритет операторов
Приоритет оператора – это свойство оператора, влияющее на очерёдность его выполнения в выражении с несколькими различными операторами при отсутствии явного указания на порядок их вычисления. Операторы с более высоким приоритетом выполняются раньше операторов с более низким приоритетом.
В колонке Оператор
троеточием показано расположение операндов относительно оператора.
В колонке А
указана ассоциативность оператора. Ассоциативность - это порядок, в котором обрабатываются операторы с одинаковым приоритетом. Например, оператор вычитания имеет ассоциативность слева направо, поэтому следующие два выражения эквивалентны:
x - y - z (x - y) - z
Оператор присваивания имеет ассоциативность справа налево, поэтому следующие два выражения эквивалентны:
w = x = y = z w = (x = (y = z))
В колонке О
указано количество операндов.
В колонке Типы значений
перед стрелкой указаны ожидаемые типы операндов, а после стрелки тип возвращаемого значения.
lval (сокращение от left value) – левостороннее выражение. Это исторический термин, обозначающий выражение, которое может присутствовать слева от оператора присваивания. Левосторонними выражениями являются: переменные, свойства объектов и элементы массивов.
В таблице ниже операторы перечислены в порядке уменьшения приоритета, горизонтальные линии отделяют группы операторов с разным уровнем приоритета.
Оператор | Тип оператора | А | О | Типы значений |
---|---|---|---|---|
(…) | Группировка | отсутствует |
1 | любое→любое |
… . … … […] new … ( ) |
Оператор доступа Оператор доступа new (со списком аргументов) |
слева направо слева направо отсутствует |
2 2 1 |
lval, lval → любой lval, строка или число → любой конструктор → объект |
… ( ) new … |
Вызов функции new (без аргументов) |
слева направо справа налево |
1 1 |
функция → любой конструктор → объект |
… ++ … -- |
Постфиксный инкремент Постфиксный декремент |
отсутствует отсутствует |
1 1 |
lval → число lval → число |
! … ~ … + … - … ++ … -- … delete … typeof … void … |
Логическое НЕ (инверсия) Побитовое НЕ (инверсия) Унарный плюс Унарный минус Префиксный инкремент Префиксный декремент Удаление Определяет тип данных Возврат неопределённого значения |
справа налево справа налево справа налево справа налево справа налево справа налево справа налево справа налево справа налево |
1 1 1 1 1 1 1 1 1 |
любое → булево целое → целое число → число число → число lval → число lval → число lval → булево любое → строка любое → undefined |
… ** … … * … … / … … % … |
Возведение в степень Умножение Деление Деление с остатком |
справа налево слева направо слева направо слева направо |
2 2 2 2 |
число, число → число число, число → число число, число → число число, число → число |
… + … … - … … + … |
Сложение Вычитание Конкатенация |
слева направо слева направо слева направо |
2 2 2 |
число, число → число число, число → число строка, строка → строка |
… << … … >> … … >>> … |
Сдвиг битов влево Сдвиг битов вправо с сохранением знака Сдвиг битов вправо с заполнением нулями |
слева направо слева направо слева направо |
2 2 2 |
целое, целое → целое целое, целое → целое целое, целое → целое |
… < … … <= … … > … … >= … … in … … instanceof … |
Меньше чем Меньше или равно Больше чем Больше или равно Проверка наличия свойства Проверка на принадлежность к данному типу |
слева направо слева направо слева направо слева направо слева направо слева направо |
2 2 2 2 2 2 |
число, число → булево число, число → булево число, число → булево число, число → булево строка, объект → булево объект, конструктор → булево |
… == … … != … … === … … !== … |
Равно Не равно Строго равно Строго не равно |
слева направо слева направо слева направо слева направо |
2 2 2 2 |
любое, любое → булево любое, любое → булево любое, любое → булево любое, любое → булево |
… & … | Побитовое И | слева направо | 2 | целое, целое → целое |
… ^ … | Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ | слева направо | 2 | целое, целое → целое |
… | … | Побитовое ИЛИ | слева направо | 2 | целое, целое → целое |
… && … | Логическое И | слева направо | 2 | любое, любое → любое |
… || … | Логическое ИЛИ | слева направо | 2 | любое, любое → любое |
… ? … : … | Тернарный оператор | справа налево | 3 | булево, любое, любое → любое |
… = … … += … … -= … … **= … … *= … … /= … … %= … … <<= … … >>= … … >>>= … … &= … … ^= … … |= … |
Присваивание Операция с присваиванием Операция с присваиванием Операция с присваиванием Операция с присваиванием Операция с присваиванием Операция с присваиванием Операция с присваиванием Операция с присваиванием Операция с присваиванием Операция с присваиванием Операция с присваиванием Операция с присваиванием |
справа налево справа налево справа налево справа налево справа налево справа налево справа налево справа налево справа налево справа налево справа налево справа налево справа налево |
2 2 2 2 2 2 2 2 2 2 2 2 2 |
lval, любое → любое lval, любое → любое lval, любое → любое lval, любое → любое lval, любое → любое lval, любое → любое lval, любое → любое lval, любое → любое lval, любое → любое lval, любое → любое lval, любое → любое lval, любое → любое lval, любое → любое |
yield … yield* … |
yield yield* |
справа налево справа налево |
1 1 |
|
... … | Расширение | отсутствует | 1 | |
… , … | Запятая | слева направо | 2 | любое, любое → любое |