Для чего используется оператор запятая javascript
Оператор запятая
Продолжаем тему операторов, на этот раз вас ждет рассказ об операторе запятая.
Начнем с забавного твита:
‘c’ в конце — это оператор запятая. Последняя в списке значимых операторов, мало документированная, но очень полезная. Она не так распространена, но она мне очень нравится. Она проста, элегантна, и с ней лучше быть в хороших отношениях.
Что она делает?
Почему в вашем примере присваивания переменных окружены круглыми скобками?
Приоритет операторов определяет, в каком порядке будут выполнены операнды внутри выражения.
Полный список операторов тут. Оператор запятая имеет наименьший приоритет из всех операторов. Давайте посмотрим на примере:
Сейчас давайте посмотрим что будет если мы уберем круглые скобки:
Обрамляя выражение круглыми скобками, мы создаем группу, которая имеет наивысший приоритет.
Это гарантирует, что оператор запятая будет применен в первую очередь.
На практике, благодаря своему низкому приоритету, запятая — мощное средство. Фактически, она говорит интерпретатору: сначала посмотри, что же делают все остальные операторы вокруг меня, а потом позволь мне украсить собой результат.
Некоторые выражения содержат несколько запятых. Как это работает?
Каждый оператор в цепочке обрабатывается последовательно слева направо.
Что насчет запятых, использующихся в литералах типа и в объявлениях?
Эти разделители на самом деле не операторы запятая. Назначение разделителя-запятая — разделение членов в списке. К примеру:
Зачем использовать оператор запятая?
Затем, что она позволяет вам выполнить несколько выражений в том месте, где JavaScript ожидает только одно. Выражения с оператором запятая не такие распространенные, редко важные, но очень элегантные:
Разве точка с запятой — не замаскированная запятая?
Точка с запятой — это разделитель объявлений, а запятая — это разделитель выражений внутри объявлений.
Почему бы не использовать оператор && для выполнения нескольких выражений последовательно?
Оператор запятая очень близка к оператору && и ||. Все эти операторы возвращают последнее выражение, которое они выполнили. Вот в чем их различие:
LHE — левое выражение
RHE — правое выражение
LHE && RHE
1. Всегда выполняет LHE
2. если LHE — true, выполняет RHE
LHE || RHE
1. Всегда выполняет LHE
2. Если LHE — false, выполняет RHE
LHE, RHE
1. Всегда выполняет LHE
2. Всегда выполняет RHE
Вам следует выбрать запятую, если оба выражения должны быть выполнены.
Как насчет примеров?
Как я отмечал ранее, оператор запятая позволяет вам выполнить несколько выражений в том месте, где JavaScript ожидает только одно.
Циклы for
Вот альтернативная версия генератора чисел Фибоначчи, которая также использует оператор запятая:
Для другого примера рассмотрим утилиту, которая помогает продавцу выбирать купюры и монеты, составляющие сдачу покупателя:
Та же самая утилита, но с форматированием:
Следующая функция использует запятую для одновременного увеличения и уменьшения двух переменных внутри цикла. На выходе получаем кривую:
Циклы while
Вы можете использовать оператор запятая для создания кратких версий циклов do-while.
Эта функция ищет предка из списка элементов с именем tagName (аналог jQuery parent).
Тернарный оператор
Тернарный оператор позволяет выполнять только одно выражение. Если вам необходимо выполнить несколько выражений, то вам приходится переходить на if else. Оператор запятая более читаемый в тех случаях когда он используется для комбинации коротких выражений:
Дебаг
Оператор запятая позволяет вам вставлять console.log в любое место без изменения кода:
Связывание с итераторами
@wavded опубликовал один способ применения запятой.
Косвенный вызов eval
eval 1 использует тот контекст в котором был вызван. Поэтому нет гарантий, что вызов eval в цикле даст тот же самый результат.
kangax написал, что мы можем использовать оператор запятая для косвенного вызова eval, который будет всегда вызываться в глобальном контексте 2 :
1. Пожалуйста без холиваров, все знают, что eval — evil
2. В стандарте ES5 написано, что любой не прямой вызов eval использует глобальный контекст,
однако не все браузеры поддерживают это правило (IE
Выражения и операторы
Эта глава описывает все операторы, выражения и ключевые слова языка JavaScript.
Выражения и операторы по категориям
Алфавитный список смотрите в боковой панели слева.
Первичные выражения
Базовые ключевые слова и общие выражения в JavaScript.
this Ключевое слово this ссылается на контекст выполняемой функции. function Ключевое слово function определяет выражение функции. class Ключевое слово class определяет выражение класса. function* Ключевое слово function* (со звёздочкой) определяет функцию-генератор. yield Пауза или продолжение выполнения функции-генератора. yield* Делегирует выполнение другому генератору итерируемому объекту. async function* async function определяет выражение асинхронной функции. await Пауза и продолжение выполнения асинхронной функции и ожидание Promise (результата выполнения) с результатом разрешено/отклонено. [] Синтаксис создания инициализатора/литерала массива. <> Синтаксис создания инициализатора/литерала объекта /ab+c/i Синтаксис создания литерала регулярного выражения. ( ) Оператор группировки.
Левосторонние выражения
Значения слева являются назначением присваивания.
Инкремент и декремент
Операторы постфиксного/префиксного инкремента и декремента.
Унарные операторы
Унарные операции — это операции с одним операндом.
Арифметические операторы
Арифметические операторы своими операндами принимают числовые значения (литералы или переменные) и возвращают одно числовое значение.
Реляционные операторы
in Оператор in определяет, содержит ли объект указанное свойство. instanceof Оператор instanceof определяет, является ли объект экземпляром потомком Prototype (или экземпляром) другого объекта. (en-US) Оператор меньше. > (en-US) Оператор больше. (en-US) Оператор меньше или равно. >= (en-US) Оператор больше или равно.
Заметьте: => это не оператор. Это нотация для Стрелочных функций.
Операторы равенства
Результат вычисления оператора равенства всегда имеет тип Boolean и значение, зависящее от того, был ли результат проверки истинным или ложным.
Операторы побитового сдвига
Операции для сдвига всех битов операнда.
(en-US) Оператор побитового сдвига влево. >> (en-US) Оператор знакового побитового сдвига вправо. >>> (en-US) Оператор беззнакового побитового сдвига вправо.
Бинарные побитовые операторы
Побитовые операторы трактуют свои операнды как набор из 32 битов (нулей и единиц) и возвращают стандартные числовые значения JavaScript.
& (en-US) Оператор побитового И. | (en-US) Оператор побитового ИЛИ. ^ (en-US) Оператор побитового ИСКЛЮЧАЮЩЕГО ИЛИ.
Бинарные логические операторы
Логические операторы обычно используются вместе с булевыми (логическими) значениями и в сочетании с ними они возвращают булево значение.
&& (en-US) Оператор логического И. || (en-US) Оператор логического ИЛИ.
Условный (тернарный) оператор
Операторы присваивания
Операторы присваивания присваивают значение своему левому операнду, зависящее от значения их правого операнда.
Базовые операторы, математика
В этой главе мы начнём с простых операторов, а потом сконцентрируемся на специфических для JavaScript аспектах, которые не проходят в школьном курсе арифметики.
Термины: «унарный», «бинарный», «операнд»
Прежде, чем мы двинемся дальше, давайте разберёмся с терминологией.
Унарным называется оператор, который применяется к одному операнду. Например, оператор унарный минус «-» меняет знак числа на противоположный:
Бинарным называется оператор, который применяется к двум операндам. Тот же минус существует и в бинарной форме:
Формально, в последних примерах мы говорим о двух разных операторах, использующих один символ: оператор отрицания (унарный оператор, который обращает знак) и оператор вычитания (бинарный оператор, который вычитает одно число из другого).
Математика
Поддерживаются следующие математические операторы:
Первые четыре оператора очевидны, а про % и ** стоит сказать несколько слов.
Взятие остатка %
Возведение в степень **
В выражении a ** b оператор возведения в степень умножает a на само себя b раз.
Математически, оператор работает и для нецелых чисел. Например, квадратный корень является возведением в степень 1/2 :
Сложение строк при помощи бинарного +
Давайте рассмотрим специальные возможности операторов JavaScript, которые выходят за рамки школьной арифметики.
Обычно при помощи плюса ‘+’ складывают числа.
Но если бинарный оператор ‘+’ применить к строкам, то он их объединяет в одну:
Обратите внимание, если хотя бы один операнд является строкой, то второй будет также преобразован в строку.
Как видите, не важно, первый или второй операнд является строкой.
Вот пример посложнее:
Например, вычитание и деление:
Приведение к числу, унарный +
Плюс + существует в двух формах: бинарной, которую мы использовали выше, и унарной.
Унарный, то есть применённый к одному значению, плюс + ничего не делает с числами. Но если операнд не число, унарный плюс преобразует его в число.
Необходимость преобразовывать строки в числа возникает очень часто. Например, обычно значения полей HTML-формы — это строки. А что, если их нужно, к примеру, сложить?
Бинарный плюс сложит их как строки:
Поэтому используем унарный плюс, чтобы преобразовать к числу:
С точки зрения математика, такое изобилие плюсов выглядит странным. Но с точки зрения программиста тут нет ничего особенного: сначала выполнятся унарные плюсы, которые приведут строки к числам, а затем бинарный ‘+’ их сложит.
Почему унарные плюсы выполнились до бинарного сложения? Как мы сейчас увидим, дело в их приоритете.
Приоритет операторов
В том случае, если в выражении есть несколько операторов – порядок их выполнения определяется приоритетом, или, другими словами, существует определённый порядок выполнения операторов.
Из школы мы знаем, что умножение в выражении 1 + 2 * 2 выполнится раньше сложения. Это как раз и есть «приоритет». Говорят, что умножение имеет более высокий приоритет, чем сложение.
В JavaScript много операторов. Каждый оператор имеет соответствующий номер приоритета. Тот, у кого это число больше, – выполнится раньше. Если приоритет одинаковый, то порядок выполнения – слева направо.
Отрывок из таблицы приоритетов (нет необходимости всё запоминать, обратите внимание, что приоритет унарных операторов выше, чем соответствующих бинарных):
Приоритет | Название | Обозначение |
---|---|---|
… | … | … |
17 | унарный плюс | + |
17 | унарный минус | — |
16 | возведение в степень | ** |
15 | умножение | * |
15 | деление | / |
13 | сложение | + |
13 | вычитание | — |
… | … | … |
3 | присваивание | = |
… | … | … |
Присваивание
Присваивание = возвращает значение
Тот факт, что = является оператором, а не «магической» конструкцией языка, имеет интересные последствия.
Вызов x = value записывает value в x и возвращает его.
Благодаря этому присваивание можно использовать как часть более сложного выражения:
В примере выше результатом (a = b + 1) будет значение, которое присваивается переменной a (то есть 3 ). Потом оно используется для дальнейших вычислений.
Забавное применение присваивания, не так ли? Нам нужно понимать, как это работает, потому что иногда это можно увидеть в JavaScript-библиотеках.
Однако писать самим в таком стиле не рекомендуется. Такие трюки не сделают ваш код более понятным или читабельным.
Присваивание по цепочке
Рассмотрим ещё одну интересную возможность: цепочку присваиваний.
Опять-таки, чтобы код читался легче, лучше разделять подобные конструкции на несколько строчек:
Польза от такого стиля особенно ощущается при быстром просмотре кода.
Сокращённая арифметика с присваиванием
Часто нужно применить оператор к переменной и сохранить результат в ней же.
Эту запись можно укоротить при помощи совмещённых операторов += и *= :
Прочие операторы
Курс: Основы HTML и CSS
Курс: Разработка на C#
Курс: Python-разработчик с нуля
Осваивайте профессию, начните зарабатывать, а платите через год!
Курсы Python Акция! Бесплатно!
Станьте хакером на Python за 3 дня
Веб-вёрстка. CSS, HTML и JavaScript
Станьте веб-разработчиком с нуля
Оператор typeof
Оператор typeof — это унарный оператор, который записывается перед своим единственным операндом любого типа и возвращает строковое значение, содержащее тип операнда.
Следующая таблица определяет значения оператора typeof для всех значений, возможных в языке JavaScript:
Значение x | typeof x |
---|---|
undefined null true или false любое число, Infinity или NaN любая строка, «» любая функция, function() <> любой объект или массив, <>|[] любой символ, SymЬol() | «undefined» «object» «boolean» «number» «string» «function» «object» «symbol» |
Операнд оператора typeof может быть записан в двух формах – в скобках () и без скобок:
Примечание: Операнд typeof можно заключить в скобки (), благодаря чему ключевое слово typeof выглядит как имя функции, а не как ключевое слово или оператор: typeof(x). Последнее – вполне допустимый синтаксис, впрочем необязательные круглые скобки лишь создают ненужную группу выражений.
У оператора typeof есть одна особенность, которую обычно называют ошибкой: typeof null возвращает «object». Тем не менее, это технически правильное значение, потому что специальное значение null считается ссылкой на пустой объект.
На заметку: Несмотря на то, что функции в JavaScript являются разновидностью объектов, а не отдельным типом данных, оператор typeof выделяет функции отдельно, возвращая для них «function». На практике эта особенность позволяет легко определить функцию, что обычно весьма удобно.
Оператор void
Это не рекомендуемый подход, но время от времени он встречается в HTML-документах.
Оператор «запятая» (,)
Оператор «запятая» (,) выполняет оба операнда (слева направо) и возвращает значение второго оператора. Левый операнд вычисляется всегда и перед вычислением правого операнда учитываются все побочные эффекты.
Это означает, что значение выражения, находящегося с правой стороны, станет значением разделенного запятыми выражения. Например:
На заметку: Заметьте, что запятая при объявлении переменных с помощью ключевого слова var – это не оператор «запятая», так как в данном случае она находиться не в выражении. Скорее, это разделитель в объявлении переменных комбинирующий их множество в одно выражение.
Следующий пример демонстрирует, что хотя переменной y будет присвоен только последний элемент (x), но выражение слева от запятой (x += 1) также будет вычислено:
На практике оператор «запятая» обычно используется только в сочетании с инструкцией for :
Здесь первая запятая является частью синтаксиса инструкции var. Вторая запятая является оператором: она позволяет внедрить два выражения (i++ и j—) в инструкцию (цикл for), которая ожидает одно выражение.
Операторы доступа (.) и ([])
В JavaScript объект — это набор свойств ассоциированных с ним. Свойство объекта можно рассматривать как переменную, которая закреплена за этим объектом. Свойства объекта определяют его характеристики. Получить доступ к свойству объекта можно с помощью оператора «точка» (.) или оператора «квадратные скобки» ([]).
Например, давайте создадим объект myAuto и, применив оператор «точка», определим его свойства make, model, и year. Вы определяете свойство, просто указывая его значение следующим образом:
Слева от оператора «точка» (.) указывается объект (массив или функция), а справа – идентификатор (имя свойства), к которому выполняется доступ.
Слева от оператора «квадратные скобки» [] указывается объект (массив или функция), а внутри квадратных скобок – имя свойства (или индекс элемента массива). Именем свойства может быть строка или число.
Примечание: Правый операнд оператора «точка» (.) не может быть строкой или переменной, содержащей строку – он должен быть точным именем свойства или метода без каких-либо кавычек.
Оператор «квадратные скобки» [] обычно применяется для обращения к элементам массива. Для доступа к свойствам объекта оператор [] менее удобен, так как требует заключения имени свойства в кавычки.
Доступ к любому имени свойства, которое содержит невалидный JavaScript идентификатор (например, имя свойства включает в себя пробелы, тире, знаки пунктуации или начинается с цифры), может быть получен с использованием квадратных скобок:
Такое присвоение как person[«favorite music»] или person[«my name»] было бы невозможно через оператор «точка», так интерпретатор JavaScript после первого пробела подумает, что свойство закончилось, и далее выдаст синтаксическую ошибку:
Для чего используется оператор запятая javascript
Для работы с переменными, со значениями, JavaScript поддерживает все стандартные операторы, большинство которых есть и в других языках программирования.
В этой главе мы сконцентрируемся на операторах, которые в курсе математики не проходят, и на их особенностях в JavaScript.
Термины: «унарный», «бинарный», «операнд»
У операторов есть своя терминология, которая используется во всех языках программирования.
Унарным называется оператор, который применяется к одному операнду. Например, оператор унарный минус «-» меняет знак числа на противоположный:
Бинарным называется оператор, который применяется к двум операндам. Тот же минус существует и в бинарной форме:
Сложение строк, бинарный +
Обычно при помощи плюса ‘+’ складывают числа.
Но если бинарный оператор ‘+’ применить к строкам, то он их объединяет в одну:
Иначе говорят, что «плюс производит конкатенацию (сложение) строк».
Если хотя бы один аргумент является строкой, то второй будет также преобразован к строке!
Причем не важно, справа или слева находится операнд-строка, в любом случае нестроковый аргумент будет преобразован. Например:
Остальные арифметические операторы работают только с числами и всегда приводят аргументы к числу.
Преобразование к числу, унарный плюс +
Унарный, то есть применённый к одному значению, плюс ничего не делает с числами:
Например, когда мы получаем значения из HTML-полей или от пользователя, то они обычно в форме строк.
А что, если их нужно, к примеру, сложить? Бинарный плюс сложит их как строки:
Поэтому используем унарный плюс, чтобы преобразовать к числу:
Почему унарные плюсы выполнились до бинарного сложения? Как мы сейчас увидим, дело в их приоритете.
Отрывок из таблицы:
Приоритет | Название | Обозначение |
---|---|---|
. | . | . |
15 | унарный плюс | + |
15 | унарный минус | — |
14 | умножение | * |
14 | деление | / |
13 | сложение | + |
13 | вычитание | — |
. | . | . |
3 | присваивание | = |
. | . | . |
Возможно присваивание по цепочке:
««smart header=»Оператор \»=\» возвращает значение» Все операторы возвращают значение. Вызов `x = выражение` не является исключением.
Забавное применение присваивания, не так ли?
Побитовые операторы рассматривают аргументы как 32-разрядные целые числа и работают на уровне их внутреннего двоичного представления.
Эти операторы не являются чем-то специфичным для JavaScript, они поддерживаются в большинстве языков программирования.
Поддерживаются следующие побитовые операторы:
Они используются редко, поэтому вынесены в отдельную главу info:bitwise-operators.
Сокращённая арифметика с присваиванием
Часто нужно применить оператор к переменной и сохранить результат в ней же, например:
Эту запись можно укоротить при помощи совмещённых операторов, вот так:
Вызов с присваиванием имеет в точности такой же приоритет, как обычное присваивание, то есть выполнится после большинства других операций:
Его можно вызвать явным образом, например:
Зачем же нужен такой странный оператор, который отбрасывает значения всех перечисленных выражений, кроме последнего?
Обычно он используется в составе более сложных конструкций, чтобы сделать несколько действий в одной строке. Например:
Такие трюки используются во многих JavaScript-фреймворках для укорачивания кода.