JavaScript. Подробное руководство, 6-е издание
Шрифт:
При вычислении выражения вызова первым вычисляется выражение, возвращающее функцию, а затем вычисляются выражения аргументов и создается список значений аргументов. Если значением выражения, возвращающего функцию, не является вызываемый объект, возбуждается исключение
Все выражения вызова включают пару круглых скобок и выражение перед открывающей круглой скобкой. Если это выражение является выражением обращения к свойству, такой вызов называется вызовом метода. При вызове метода объект или массив, к свойству которого производится обращение, становится значением параметра this, доступного в теле функции во время его выполнения. Это обеспечивает поддержку парадигмы объектно-ориентированного программирования, согласно которой функции (в ООП обычно называются «методами») получают возможность манипулировать объектом, частью которого они являются. Подробности приводятся в главе 9.
ECMAScript 5, если функция определяется в строгом режиме, при вызове она получает в ключевом слове
4.6. Выражения создания объектов
Выражение создания объекта создает новый объект и вызывает функцию (называемую конструктором) для инициализации свойств этого объекта. Выражения создания объектов похожи на выражения вызова, за исключением того, что им предшествует ключевое слово new:
Если в выражении создания объекта функции-конструктору не передается ни одного аргумента, пустую пару круглых скобок можно опустить:
При вычислении выражения создания объекта интерпретатор JavaScript сначала создает новый пустой объект, как если бы для создания использовался пустой инициализатор объекта
Более подробно конструкторы описываются в главе 9.
4.7. Обзор операторов
В языке JavaScript операторы используются в арифметических выражениях, выражениях сравнения, логических выражениях, выражениях присваивания и т. д. Перечень операторов приводится в табл. 4.1, которую можно использовать как справочник.
Таблица 4.1. Операторы JavaScript | ||||
---|---|---|---|---|
Оператор | Операция | А | N | Типы значений |
++ | Префиксный и постфиксный инкремент | R | 1 | левостороннее выражение —> число |
– - | Префиксный и постфиксный декремент | R | 1 | левостороннее выражение —> число |
– | Унарный минус | R | 1 | число —> число |
+ | Преобразование в число | R | 1 | число —> число |
~ | Поразрядная инверсия | R | 1 | целое —> целое |
Оператор | Операция | А | N | Типы значений |
! | Логическая инверсия | R | 1 | логическое —> логическое |
delete | Удаление свойства | R | 1 | левостороннее выражение —> логическое |
typeof | Определение типа операнда | R | 1 | любое —> строка |
void | Возврат неопределенного значения | R | 1 | любое —> undefined |
*, /, % | Умножение, деление, деление по модулю | L | 2 | число, число —> число |
+, - | Сложение, вычитание | L | 2 | число, число —> число |
+ | Конкатенация строк | L | 2 | строка, строка —> строка |
<< | Сдвиг влево | L | 2 | целое, целое —> целое |
>> | Сдвиг вправо с сохранением знака | L | 2 | целое, целое —> целое |
>>> | Сдвиг вправо с заполнением нулями | L | 2 | целое, целое -> целое |
<, <=, >, >= | Сравнение
| L | 2 | число, число —> логическое |
<, <=, >, >= | Сравнение строк | L | 2 | строка, строка —> логическое |
instanceof | Проверка на принадлежность классу | L | 2 | объект, функция —> логическое |
in | Проверка наличия свойства | L | 2 | строка, объект —> логическое |
== | Проверка равенства | L | 2 | любое, любое —»логическое |
!= | Проверка неравенства | L | 2 | любое, любое —> логическое |
=== | Проверка идентичности | L | 2 | любое, любое —> логическое |
!== | Проверка неидентичности | L | 2 | любое, любое —»логическое |
& | Поразрядное И | L | 2 | целое, целое —»целое |
^ | Поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ | L | 2 | целое, целое —»целое |
| | Поразрядное ИЛИ | L | 2 | целое, целое —»целое |
&& | Логическое И | L | 2 | любое, любое —> любое |
|| | Логическое ИЛИ | L | 2 | любое, любое —> любое |
?: | Выбор второго или третьего операнда | R | 3 | логическое, любое, любое —> любое |
= | Присваивание переменной или свойству | R | 2 | левостороннее выражение, любое —> любое |
*=. /=. %=. +=. – =, &=, "=, |=, <<=, >>=, >>>= | Операция с присваиванием | R | 2 | левостороннее выражение, любое —> любое |
, | Отбросить первый операнд, вернуть второй | L | 2 | любое, любое —> любое |
Обратите внимание, что большинство операторов обозначаются символами пунктуации, такими как
Операторы в табл. 4.1 перечисленны в порядке их приоритетов. Операторы перечисленные первыми имеют более высокий приоритет. Операторы отделенные горизонтальной линией, имеют разные приоритеты. Столбец «А» в этой таблице содержит ассоциативность оператора (либо L - слева направо, либо R - справа налево), а столбец «N» определяет количество операндов. В столбце «Типы значений» указаны ожидаемые типы операндов и (после символа —») тип результата, возвращаемого оператором. В подразделах, следующих за таблицей, описываются концепции приоритетов, ассоциативности и типов операндов. Вслед за этим приводится обсуждение самих операторов.
4.7.1. Количество операндов
Операторы могут быть разбиты на категории по количеству требуемых им операндов. Большинство JavaScript-операторов, таких как оператор умножения *, являются двухместными. Такие операторы объединяют два выражения в одно, более сложное. То есть эти операторы работают с двумя операндами. JavaScript поддерживает также несколько унарных операторов, которые преобразуют одно выражение в другое, более сложное. Оператор - в выражении -х является унарным оператором, выполняющим смену знака операнда х. И, наконец, JavaScript поддерживает один тернарный условный оператор ?:, который объединяет три выражения в одно.
4.7.2. Типы данных операндов и результата
Некоторые операторы могут работать со значениями любых типов, но большинство из них требуют, чтобы операнды имели значения определенного типа, и большинство операторов возвращают значение определенного типа. Колонка «Типы значений» в табл. 4.1 определяет типы операндов (перед стрелкой) и тип результата (после стрелки) для операторов.
Операторы в языке JavaScript обычно преобразуют типы своих операндов (как описывается в разделе 3.8) по мере необходимости. Оператор умножения * ожидает получить числовые операнды, однако выражение "3" * "5" считается вполне допустимым благодаря тому, что интерпретатор выполнит преобразование строковых операндов в числа. Значением этого выражения будет число 15, а не строка "15". Не забывайте также, что любое значение в JavaScript может быть «истинным» или «ложным», поэтому операторы, ожидающие получить логические операнды, будут работать с операндами любого типа.
Некоторые операторы ведут себя по-разному в зависимости от типа операндов. Самый яркий пример - оператор +, который складывает числовые операнды и выполняет конкатенацию строк. Аналогично операторы сравнения, такие как <, сравнивают значения как числа или как строки, в зависимости от типов операндов. О зависимостях от типов операндов и о выполняемых преобразованиях будет рассказываться в описаниях отдельных операторов.
4.7.3. Левосторонние выражения
Обратите внимание, что операторы присваивания, как и некоторые другие, перечисленные в табл. 4.1, ожидают получить в качестве операндов левосторонние выражения (lvalue). Левостороннее выражение - это исторический термин, обозначающий «выражение, которое может присутствовать слева от оператора присваивания». В JavaScript левосторонними выражениями являются переменные, свойства объектов и элементы массивов. Спецификация ECMAScript разрешает встроенным функциям возвращать левосторонние выражения, но не определяет никаких встроенных функций, ведущих себя подобным образом.