10 способов поменять местами два значения в JavaScript
В какой-то момент своей карьеры разработчики сталкиваются с задачей обмена значениями. Большую часть времени мы пользуемся классическим методом с использованием дополнительной переменной. Ах, если бы был способ лучше. Но подождите-ка! Такой способ есть, и не один. В моменты отчаяния мы серфим интернет в поисках решений, находим одно, копируем его без какого-либо понимания, как работает этот кусочек кода. К счастью для вас, сейчас самое время понять, как поменять местами два значения просто и эффективно.
1) Использование временной переменной
Сразу отсечем самое очевидное решение.
2) Использование сложения и вычитания
Да, вы прочитали правильно. Мы можем использовать немного магии математики, чтобы обменять парочку значений.
Что-о-о!? Ага, а теперь давайте посмотрим, как это работает. Мы получаем сумму двух чисел на 4 строке. Сейчас, если мы вычтем одно число из суммы, то получим другое число. Это как раз то, что мы делаем на 5 строке. Вычитание num2 из суммы, которая находится в num1, дает нам изначальное значение num1, которое помещается в num2. Аналогично мы получаем num2 и помещаем его в num1 на 6 строке.
Осторожно: на просторах интернета гуляет еще один метод обмена в одну строчку лишь с операцией сложения.
Вот как он выглядит:
Код выше дает ожидаемый результат. Выражение внутри () хранит num2 в num1, затем мы вычитаем num1 — num2, а это ноль, так как num2 — num2 = 0. Следовательно, мы получаем нужный результат. Но когда мы используем числа с плавающей точкой, иногда можем увидеть неожиданный результат.
Поиграйтесь в консоли с дробными входными параметрами, как в коде ниже.
3) Использование сложения или вычитания
Мы можем получить тот же результат, используя только операцию сложения.
Посмотрим, как этого добиться:
Эта программа работает, но ее читабельность явно страдает. На 4 строке в скобках мы присваиваем num1 num2 и возвращаем 0. По сути наша строка выглядит так:
Отсюда мы и получаем наш результат.
Замечание: некоторые движки JavaScript могут выполнять свои собственные оптимизации приведенного выше кода, который игнорирует + 0.
4) Использование умножения и деления
Еще немного магии при помощи операторов умножения и деления.
Принцип тот же, что и в предыдущем методе, но с парочкой «причудов».
Собственно, здесь все похоже. Получаем произведения двух чисел и храним его в одном из чисел. Это то, что происходит на 4 строке. Затем делим произведение на второе число и получаем первое, потом повторяем процесс и получаем второе число.
Вы сделали это! Да вы «математический фокусник«.
Погодите! Что насчет тех «причудов»?
Давайте попробуем запустить следующий код.
Наши значения не поменяются местами, и вместо этого мы получим NaN. Если вы посещали уроки математики, то помните, что вам всегда говорили не делить на 0, потому что получится неопределенность. Причина кроется в работе ограничений и в некоторых других вещах, в которые мы погружаться не будем. Сейчас же мы посмотрим на еще одну проблему этого метода.
Да, вновь NaN. Потому что мы не можем делить на бесконечность, это также неопределенность.
Хотите увидеть еще одну причуду? Я так и думал!
-бесконечность будет возвращать то же значение, как в прошлом примере, по той же причине.
Даже «математический фокусник» при всех своих силах не может сделать невозможного.
Ниже представлена краткая версия обмена с умножением и делением с теми же проблемами:
Этот код аналогичен краткой версии обмена со сложением и вычитанием. Мы присваиваем num1 num2, а потом 4 строка выглядит так:
Вуаля! Наши значения поменялись местами.
5) Использование умножения или деления
Эта программа работает, но ее читабельность явно страдает. На 4 строке в скобках мы присваиваем num1 num2 и возвращаем 1. На деле наша строка выглядит так:
И мы вновь получаем требуемый результат.
6) Использование побитового исключающего ИЛИ
XOR манипулирует битами. Возвращает 1, когда значения переменных различны, и 0 в противном случае.
Теперь поймем, как это работает.
4-ех битное представление 10 -> 1010
4-ех битное представление 1 -> 0001
Вуаля! Мы вновь поменяли значения местами.
Посмотрим другой пример.
Хм, где же обмен? Мы получили только целую часть числа. И в этом проблема такого способа. XOR предполагает, что входные параметры это целые числа, и уже в соответствии с этим производит вычисления. Но числа с плавающей точкой не являются целыми и представлены стандартом IEEE 754, согласно которому число разбивается на 3 части: знаковый бит, группа битов, представляющих показатель степени, еще одна группа битов, представляющая число между 1 (включая) и 2 (не включая), то есть мантиссу. Поэтому мы и получаем не тот результат.
Еще один пример:
И снова не тот результат, который мы ожидали. Все потому, что бесконечность и -бесконечность это числа с плавающей точкой, а, как мы уже поняли, для XOR это проблема.
7) Использование побитового исключающего НЕ ИЛИ
Эта операция противоположна исключающему ИЛИ. XNOR возвращает 0, если значения различны, и 1 в противном случае. В JavaScript нет специального оператора для XNOR, так что мы используем NOT оператор, чтобы инвертировать XOR.
Давайте поймем, как это работает!
4-ех битное представление 10 -> 1010
4-ех битное представление 1 -> 0001
На 4 строчке:
Так как мы получили отрицательное значение, нам необходимо конвертировать его в двоичное, инвертировать биты и прибавить единицу:
На 5 строчке:
На 6 строчке:
Это займет некоторое время, но мы получим обмен значений. Но, к сожалению, у этого способа будут те же проблемы, что и у метода с XOR. Все плохо с числами с плавающей точкой и бесконечностями.
Попробуйте поэкспериментировать со значениями, как в коде ниже.
8) Использование присваивания внутри массива
Это трюк в одну строку. Правда! Вам просто нужна одна строка для обмена и, что более важно, никакой математики. Понадобятся лишь базовые знания о массивах. Может выглядеть странно, но оно работает.
Посмотрим на этот метод в действии!
В нулевом индексе массива хранится num1, в 1 индексе мы присваиваем num1 num2 и, соответственно, храним num2. Затем мы просто обращаемся к 0 индексу, чтобы получить num1 и присвоить это значения num2. Таким образом мы может менять и целые числа, и числа с плавающей точкой, и бесконечности, и даже строки. Выглядит довольно аккуратно, но мало читабельно. Взглянем на похожий способ.
9) Использование деструктуризации
Это нововведение, появившееся в ES6. И оно очень простое. В одну линию мы можем поменять значения местами:
10) Использование немедленно вызываемой функции (IIFE)
Еще один странный вариант обмена. IIFE — это функция, которая вызывается сразу после ее объявления.
Посмотрим, как мы можем ее использовать:
В этом примере мы сразу же вызываем функцию на 4 строке. Скобки в конце это аргументы. Во втором аргументе мы присваиваем num2 num1, а первый просто возвращается из функции. Наши значения вновь поменялись местами. Но имейте в виду, этот способ не эффективный.
Заключение
В этой статье мы рассмотрели несколько способов обмена значениями в JavaScript. Надеюсь, вы подчерпнули для себя что-то новое. Спасибо за прочтение!
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode
Поменять значения двух переменных
Рассмотрим, как поменять местами значения двух переменных в коде программы. Статья предназначена тем, кто только начинает делать первые шаги в программировании.
Как только вы начнете писать свою второю в жизни программу (первая — вывод слов Hello World), вы столкнетесь с необходимостью обмена значениями между двумя числовыми переменными, поскольку манипуляции с данными непременно это предполагают. В примерах кода, которые приводятся в статье мы оперируем с целочисленными переменными типа int, но данные примеры легко адаптировать под любой вид числовых переменных: byte, long, float, double и т.п. Для этого вам будет достаточно заменить все ключевые слова int, на требуемый тип данных.
Примеры подходят и будут работать во всех Си-подобных языках программирования: C, C++, C#; а также в языке Java.
Поменять значения двух переменных
Прежде чем писать программный код, давайте подумаем, как поменять значения двух переменных в принципе. Решим данную задачу у себя в голове. А затем формализуем выработанный алгоритм действий.
Начнем с тезиса о том, что переменные в программе имеют содержимое. Они содержат информацию. Для того, чтобы провести какую-либо аналогию с жизнью, нужно подумать: а какие предметы что-нибудь в себе содержат? Первое, что приходит на ум — это ёмкость с жидкостью.
Пусть у нас есть два стакана: в одном налито молоко, а в другом кока-кола. Как нам перелить содержимое одного стакана в другой (нельзя же смешивать эти два совершенно несовместимых продукта) [заметили аналогию? ведь содержимое двух переменных нам тоже нужно поменять местами]? Ответ очевиден — понадобится третий (пустой) стакан. С помощью него удастся перелить содержимое одного стакана в другой. Вот так:
- Перелить молоко из первого стакана в третий.
- Перелить кока-колу из второго стакана в первый.
- Из третьего стакана перелить молоко во второй стакан. Готово!
Иллюстрация действий приводится на рисунке ниже.

Возвращаясь к программированию, делаем вывод, что для того, чтобы поменять значения двух переменных, понадобится промежуточная третья.
Пусть даны переменные a и b, и их значения нужно поменять местами. Нам понадобится промежуточная временная третья переменная, назовем её temp (сокращение от английского слова temporary — временный). Чтобы выполнить замену, придется также выполнить три действия:
- Присвоим переменной temp значение из переменной a.
- Присвоим a значение b.
- Присвоим b значение переменный temp. Готово!
Реализуем описанный выше алгоритм действий и составим программу обмена значениями двух переменных величин. Ниже представлен её код:
Обмен значений двух переменных без использования третьей в Python
В этом руководстве мы обсудим различные методы, используемые для обмена значений двух переменных (n1 и n2) без использования третьей переменной в программах Python.
Метод 1: с помощью встроенного метода
Встроенный метод может работать со значениями любого типа данных, такими как string, float, it. Этот метод очень прост в использовании.
Метод 2: с помощью побитового оператора XOR
Метод побитового оператора XOR применяется только для целых чисел, и он работает быстрее, поскольку он использует битовую операцию, которая предназначена для того же значения result = 0 и для другого значения result = 1.
Метод 3: с помощью операторов сложения и вычитания
Этот метод можно использовать только для числовых значений.
Метод 4: с помощью операторов умножения и деления
Этот метод можно использовать только для числовых значений, кроме 0.
Метод 5: с использованием побитовых и арифметических операторов
В этом методе мы будем использовать как побитовые, так и арифметические операторы. Этот метод работает только с целыми числами, но не с числами с плавающей запятой.
Заключение
В этом руководстве мы обсудили различные методы, используемые для обмена значениями двух переменных без использования третьей.
Поменять две переменные местами, не используя третью
Задача об обмене двух целочисленных переменных значениями (без использования третьей) является одним из классических программистских ребусов.
Как сделать это в PHP, используя минимальное количество символов?
Критерий победы — минимальное количество символов. При прочих равных условиях ответ, опубликованный раньше, побеждает. Подведение итогов через 24 часа.
Пожалуйста, указывайте в ответе количество символов, чтобы проще было выявить победителя.
Комментарий, о причине выбора победителя:
Лидирующий ответ @PashaPash (0 символов) фактически не меняет переменных, поэтому не участвует в конкурсе.
Ответ от @Naumov (10 символов), вместо обмена переменных просто присваивает им новые значения. Ну и его длина не является постоянной, а зависит от значений переменных. Рассматривать этот ответ в рамках конкурсной программы я не буду.