для чего используется оператор запятая
5.5 – Оператор запятая и условный оператор
Оператор запятая
Сначала вычисляется левый операнд оператора запятой, который увеличивает x с 1 до 2. Затем вычисляется правый операнд, который увеличивает y с 2 до 3. Оператор запятой возвращает результат правого операнда (3), который впоследствии выводится в консоль.
Обратите внимание, что запятая имеет самый низкий приоритет среди всех операторов, даже ниже, чем присваивание. Из-за этого следующие две строки кода делают разные вещи:
Это делает использование оператора запятой несколько опасным.
Практически в каждом случае инструкцию, написанную с использованием оператора запятой, лучше записать в виде отдельных инструкций. Например, приведенный выше код можно записать как:
Лучшая практика
Запятая как разделитель
В C++ символ запятой часто используется в качестве разделителя, и это использование не вызывает оператора запятой. Некоторые примеры разделителей запятыми:
Избегать разделительных запятых нет необходимости (кроме случаев объявления нескольких переменных, чего делать не следует).
Условный оператор
Оператор if / else имеет следующую форму:
Его можно переписать следующим образом:
В таких случаях условный оператор может помочь сделать код более компактным без потери читабельности.
Заключение условного оператора в скобки
Условная часть оператора обычно помещается в круглые скобки, чтобы облегчить чтение, а также, чтобы убедиться в правильности приоритетов. Остальные операнды вычисляются так, как если бы они были заключены в круглые скобки, поэтому явные скобки для них не требуются.
Или мы могли бы использовать для этого условный оператор:
Давайте посмотрим, что произойдет, если в приведенном выше случае мы не заключим в скобки весь условный оператор.
будет вычисляться как:
Лучшая практика
Всегда заключайте в скобки условную часть условного оператора, а также подумайте о том, чтобы заключить его в скобки полностью.
Условный оператор вычисляется как выражение
Например, при инициализации константной переменной:
А это много лишней работы!
Тип выражений должен быть одинаковым или конвертируемым
Чтобы соответствовать проверке типов C++, оба выражения в условном операторе должны либо быть одинакового типа, либо второе выражение должно преобразовываться в тип первого выражения.
Итак, хотя вы могли ожидать, что можете написать что-то вроде этого:
Итак, когда следует использовать условный оператор?
Лучшая практика
Используйте условный оператор только для простых условных выражений там, где вы используете результат, и где он улучшает читаемость.
Урок №41. Условный тернарный оператор, оператор sizeof и Запятая
Обновл. 11 Сен 2021 |
На этом уроке мы рассмотрим условный тернарный оператор, оператор Запятую и вспомним оператор sizeof в языке C++.
Оператор sizeof
Мы уже рассматривали оператор sizeof на уроке №30.
| Оператор | Символ | Пример | Операция |
| sizeof | sizeof | sizeof(тип) sizeof(переменная) | Возвращает размер типа данных или переменной в байтах |
Тогда мы использовали его для определения размера конкретных типов данных. Но также sizeof можно использовать и с переменными:
Оператор Запятая
Оператор Запятая (или «оператор Comma») позволяет обрабатывать несколько выражений (в то время, когда, обычно, позволяется только одно).
| Оператор | Символ | Пример | Операция |
| Запятая | , | x, y | Вычисляется x, затем вычисляется y, а затем возвращается значение y |
Выражение, в котором находится этот оператор, будет иметь значение правого операнда. Например:
Почти в каждом случае, стейтмент, в котором есть оператор Запятая, лучше записывать в виде отдельных инструкций. Вышеприведенный код корректнее будет записать следующим образом:
Обратите внимание, оператор Запятая имеет самый низкий приоритет из всех операторов (даже ниже, чем в оператора присваивания), поэтому следующие две строки кода делают не одно и то же:
Большинство программистов не используют оператор Comma вообще (разве что только в циклах for).
Обратите внимание, запятая, которая используется в вызовах функций, не является оператором Comma:
Аналогично, при объявлении нескольких переменных в одной строке, запятая используется как разделитель, а не как оператор:
Правило: Избегайте использования оператора Comma (исключением являются циклы for).
Условный тернарный оператор
if (условие)
выражение;
else
другое_выражение;
Можно записать как:
Обратите внимание, операнды условного оператора должны быть выражениями (а не стейтментами).
Например, ветвление if/else, которое выглядит следующим образом:
if (условие)
x = значение1;
else
x = значение2;
Можно записать как:
Большинство программистов предпочитают последний вариант, так как он читабельнее.
Обычно, часть с условием помещают внутри скобок, чтобы убедиться, что приоритет операций корректно сохранен и так удобнее читать.
Или с помощью тернарного оператора:
Будет обрабатываться как:
Совет: Всегда заключайте в скобки условную часть тернарного оператора, а лучше весь тернарный оператор.
Условный тернарный оператор — это удобное упрощение ветвления if/else, особенно при присваивании результата переменной или возврате определенного значения. Но его не следует использовать вместо сложных ветвлений if/else, так как в таких случаях читабельность кода резко ухудшается и вероятность возникновения ошибок только растет.
Правило: Используйте условный тернарный оператор только в тривиальных случаях.
Условный тернарный оператор вычисляется как выражение
Базовые операторы, математика
В этой главе мы начнём с простых операторов, а потом сконцентрируемся на специфических для 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-библиотеках.
Однако писать самим в таком стиле не рекомендуется. Такие трюки не сделают ваш код более понятным или читабельным.
Присваивание по цепочке
Рассмотрим ещё одну интересную возможность: цепочку присваиваний.
Опять-таки, чтобы код читался легче, лучше разделять подобные конструкции на несколько строчек:
Польза от такого стиля особенно ощущается при быстром просмотре кода.
Сокращённая арифметика с присваиванием
Часто нужно применить оператор к переменной и сохранить результат в ней же.
Эту запись можно укоротить при помощи совмещённых операторов += и *= :
Тернарный оператор и оператор запятая
Тернарный оператор и оператор запятая
Н азвание «тернарный» произошло от латинского ternarius – тройной. Оператор принимает три аргумента. Если первый аргумент истина, то возвращается второй аргумент, если ложь, то возвращается третий.
Например, пользователь вводит два числа. Присвоить переменной значение наименьшего.
Другой пример: вывести модуль числа
Здесь тернарный оператор используется вместо аргумента функции printf.
Видно, что в этом примере тернарный оператор становится нечитаемым. Поэтому не используйте вложенные тернарные операторы и заменяйте их на обычные ветвления
Для тернарного оператора определён порядок выполнения. Все значение и побочные эфекты, связанные с первым выражением реализуются перед тем, как будут реализованы значения и побочные эффекты для второго и третьего выражений.
Оператор ‘?’ в некоторых случаях можно компактно записать как оператор switch:
Оператор запятая.
О ператор «,» принимает два аргумента, выполняет первый, после этого выполняет второй и возвращает его значение. Например:
В данном примере c будет равно 4. Выражение
вернёт 4. Очевидно, что если убрать скобки, то c станет равным 3, так как запятая в этом случае будет разделять c = a = 3 и b = 4, с присвоится значение 3, а 4 будет возвращено оператором запятая, но потеряется. То есть выражение
то будет возвращено значение 5.
с будет равно 1, так как этот код эквивалентен такому
Такое поведение оператора запятая часто приводит к следующей ошибке. Вместо десятичной точки
Таким образом, переменная a будет иметь значение 5.
Для оператора «,» гарантированно выполнение по порядку, слева направо. Оператор запятая поэтому используется в условиях, когда нужно выполнить несколько действий или получить значение. Например
Часто запятая используется в цикле for, так как позволяет задавать несколько значений или выполнять несколько значений за раз. Пример – переворачивание массива.
Оператор запятая
Продолжаем тему операторов, на этот раз вас ждет рассказ об операторе запятая.
Начнем с забавного твита:
‘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