У меня есть две переменные:
var a = 1,
b = 2;
У меня вопрос как их поменять? Только это переменные, а не какие-либо объекты.
javascript
variables
swap
Lukas
источник
источник
Ответы:
Вот одна строка для обмена значениями двух переменных.
Заданы переменные
a
иb
:Демонстрация ниже:
источник
[a, b] = [b, a];
.Invalid left-hand side in assignment
ошибку.ES6 (Firefox и Chrome уже поддерживают его (сопоставление массивов назначений)):
источник
Ты можешь сделать это:
Для удобочитаемости и удобства сопровождения это не может быть лучше (по крайней мере, в JavaScript). Любой, кто будет поддерживать код (включая вас через шесть месяцев), будет точно знать, что происходит.
Поскольку это целые числа, вы также можете использовать любое количество хитрых трюков 1 для замены без использования третьей переменной. Например, вы можете использовать побитовый оператор xor:
Это называется алгоритм обмена XOR. Его теория действия описана в этой статье Википедии .
1 «Компетентный программист полностью осознает ограниченный размер своего собственного черепа. Поэтому он подходит к своей задаче с полным смирением и избегает хитрых уловок, таких как чума». - Эдсгер В. Дейкстра
источник
ToInt32
внутренний метод - см. Раздел 11.10 стандарта ECMAScript ). Он не дает правильных результатов для нецелых числовых значений. Он также преобразует нечисловые значения в 32-разрядные целые числа. Если вы начинаете сa = "hi"
иb = "there"
, вы в конечном итоге сa == 0
иb == 0
.typeof a == 'boolean'
илиa === false
, например. Действительные числа работают, за исключением того, что они смещены к нулю, а не округлены до ближайшего целого числа.Не используйте код ниже. Это не рекомендуемый способ обмена значениями двух переменных (для этого просто используйте временную переменную ). Это просто показывает трюк JavaScript.
Это решение не использует никаких временных переменных, массивов, только одно сложение, и это быстро . На самом деле, это иногда быстрее, чем временная переменная на нескольких платформах .
Он работает для всех чисел, никогда не переполняется и обрабатывает крайние случаи, такие как Infinity и NaN.
Работает в два этапа:
(b=a, 0)
устанавливаетb
старое значениеa
и дает0
a = b + 0
устанавливаетa
старое значениеb
источник
,
, и он был перенесен для установки права приоритета. Оператор запятой оценивает оба своих аргумента (в этом случаеb=a
и0
) и возвращает последний (в этом случае0
). Так что здесь, это имеет эффект установки новогоb
на старое значениеa
, уступая при этом0
.a = b + (b=a, "")
Начиная с ES6, вы также можете поменять переменные более элегантно:
источник
Вот одна строка, предполагающая
a
иb
уже существующая и имеющая значения, которые необходимо поменять местами:Как упомянул @Kay, на самом деле это работает лучше, чем в массиве (почти в 2 раза быстрее).
источник
var a, b, tmp;
a = 1
:;b = 2
;tmp=a, a=b, b=tmp;
Личный вкус.Используйте третью переменную как это:
ДЕМО - Использование третьей переменной
источник
Метод ES6 +: начиная с ES6, вы можете поменять переменные более элегантно. Вы можете использовать деструктурирование сопоставления массива присваивания. Это просто var a = 10 b = 20;
[a, b] = [b, a]
console.log (a, b) // 20 10
источник
Теперь вы можете, наконец, сделать:
источник
Вы можете использовать временную переменную подкачки или XOR.
Это просто базовая логическая концепция, которая работает на любом языке, поддерживающем операцию XOR.
редактировать: см. комментарии. Забыл сказать, что это работает точно только с целым числом. Предполагается целочисленные переменные из потока вопроса
источник
Вы можете использовать назначение деструктурирования ES6 следующим образом:
источник
Поскольку ваш вопрос был ценным «Только эти переменные, а не какие-либо объекты», ответ будет также ценным:
var a = 1, b = 2
это трюк
И, как сказал Родриго Ассис, он "может быть короче"
Демо: http://jsfiddle.net/abdennour/2jJQ2/
источник
ES6 Разрушение:
Используя массив:
[a, b] = [b, a]; // my favorite
Используя объект:
{a, b} = {a:b, b:a}; // not bad neither
источник
Как мы могли пропустить эти классические oneliners
И
Последний предоставляет глобальную переменную '_', но это не должно иметь значения, так как типичное соглашение javascript - это использовать его как переменную 'dont care'.
источник
a = (_=b,b=a,_);
_
? Почему оно не нуждается в декларации?Я вижу вид олимпиады по программированию здесь. Еще одно хитрое однострочное решение:
Скрипка: http://jsfiddle.net/cherniv/4q226/
источник
arguments
, просто сделайтеb = (function (x){ return x; })(a, a=b)
.arguments
список также будет переменной.a
кarguments[0]
пропусканием его в качестве параметра.arguments
и его назначение происходит "за кадром"Обмен одной строкой
источник
удалите или закомментируйте 2 // или и запустите с одним набором кода
http://jsfiddle.net/USdv8/57/
источник
Мы можем поменять var следующим образом:
источник
В ES6 теперь есть назначение деструктурирования, и вы можете сделать:
источник
более подробный подход будет
источник
Это очень просто, используйте синтаксис деструктуризации массива ES6, который
[y, x] = [x, y]
для получения дополнительной информации см. По этой ссылке https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignmentисточник
До ES5, чтобы поменять местами два числа, вы должны создать временную переменную, а затем поменять ее местами. Но в ES6 очень просто поменять два числа с помощью деструктуризации массива. Смотрите пример.
источник
Потому что я слышал, что этот метод работает медленнее:
Если вы планируете хранить ваши переменные в объекте (или массиве), эта функция должна работать:
Использование:
источник
Мы можем использовать IIFE для замены двух значений без дополнительного параметра
источник
Деструктуризация массива ES6 используется для замены двух переменных. См пример
Более простой способ возможен с:
x === 1
иy === 2
; Но после того, как деструктуризации,x
естьy
, то есть2
, иy
естьx
, то есть1
.источник
Поменять местами
Перестановка одной строки "используя массив"
источник
(функция (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));
источник