Как заменить две переменные в JavaScript

У меня есть две переменные:

var a = 1,
    b = 2;

Мой вопрос в том, как поменять их? Только эти переменные, а не любые объекты.

Ответ 1

Здесь однострочник для обмена значениями двух переменных.
Учитывая переменные и a b:

b = [a, a = b][0];

Демонстрация ниже:

var a=1,
    b=2,
    output=document.getElementById('output');

output.innerHTML="<p>Original: "+a+", "+b+"</p>";

b = [a, a = b][0];

output.innerHTML+="<p>Swapped: "+a+", "+b+"</p>";
<div id="output"></div>

Ответ 2

ES6 (Firefox и Chrome уже поддерживают его (сопоставление массивов назначений)):

let a = 5, b = 6;
[a, b] = [b, a];
console.log('${a} ${b}');

Ответ 3

Вы можете сделать это:

var a = 1,
    b = 2,
    tmp;
tmp = a;
a = b;
b = tmp;

Для удобства чтения и удобства обслуживания это невозможно обойти (по крайней мере, в JavaScript). Любой, кто поддерживает код (включая вас через полгода), точно знает, что происходит.

Так как это целые числа, вы можете также использовать любое количество умных трюков 1 для замены без использования третьей переменной. Например, вы можете использовать побитовый оператор xor:

var a = 1,
    b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;

Это называется алгоритмом обмена XOR. Его теория работы описана в этой статье в Википедии.

1 "Компетентный программист полностью осознает ограниченный размер своего собственного черепа. Поэтому он подходит к своей задаче с полным смирением и избегает умных трюков, таких как чума". — Эдсгер В. Дейкстра

Ответ 4

Не используйте приведенный ниже код. Не рекомендуется менять значения двух переменных (просто использовать для этого временную переменную). Он просто показывает трюк JavaScript.

В этом решении не используются временные переменные, нет массивов, только одно добавление, а быстро. Фактически, иногда быстрее временной переменной на нескольких платформах.
Он работает для всех чисел, никогда не переполняется, и обрабатывает граничные случаи, такие как Infinity и NaN.

a = b + (b=a, 0)

Он работает в два этапа:

  • (b=a, 0) устанавливает b в старое значение a и дает 0
  • a = b + 0 устанавливает a в старое значение b

Ответ 5

Здесь однострочный, предполагая, что a и b уже существуют и имеют значения, подлежащие обмену:

var c=a, a=b, b=c;

Как упоминалось в @Kay, это фактически работает лучше, чем массив (почти в 2 раза быстрее).

Ответ 6

С ES6 вы также можете более легко менять переменные:

var a = 1,
    b = 2;

[a, b] = [b, a];

console.log('a:', a, 'b:', b); // a: 2 b: 1

Ответ 7

Используйте третью переменную следующим образом:

var a = 1,
    b = 2,
    c = a;

a = b; // must be first or a and b end up being both 1
b = c;

DEMO - использование третьей переменной


Ответ 8

Метод ES6+: Начиная с ES6, вы можете поменять переменные более элегантно. Вы можете использовать деструктуризацию сопоставления массива присвоения Это просто. var a = 10 b = 20;

[a, b] = [b, a]

console.log(a, b)//20 10

Ответ 9

Вы можете использовать временную переменную swap или XOR.

a = a ^ b
b = a ^ b
a = a ^ b

Это всего лишь базовая логическая концепция и работает на всех языках, поддерживающих работу XOR.

изменить: посмотреть комментарии. Забыл сказать, что это работает только с целым числом. Предположим, что целочисленные переменные из вопросной темы

Ответ 10

Теперь вы можете:

var a = 5;
var b = 10;

[a, b] = [b, a]; // ES6

console.log(a, b);

Ответ 11

ES6 Destructuring:

Использование массива: [a, b] = [b, a]; // my favorite

Использование объекта: {a, b} = {a:b, b:a}; // not bad neither

Ответ 12

Поскольку ваш вопрос был драгоценным "Только эти переменные, а не любые объекты", ответ будет также ценным:

var a = 1,       b = 2

a=a+b;
b=a-b;
a=a-b;

это трюк

И как сказал Родриго Ассис, он "может быть короче"

 b=a+(a=b)-b;

Демо: http://jsfiddle.net/abdennour/2jJQ2/

Ответ 13

Как мы можем пропустить эти классические oneliners

var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;

и

var a = 1, b = 2
a = (_=b,b=a,_);

Последний содержит глобальную переменную '_', но это не имеет значения, поскольку типичное соглашение javascript должно использовать его как переменную `dont care '.

Ответ 14

Обмена одной строкой

a = a^b^(b^=(a^b));

Ответ 15

var a = 5;
var b = 10;

b = [a, a = b][0];
//or
b = [a, a = b];
b = b[0];

//or
b = [a, b];
a = b[1];
b = b[0];


alert("a=" + a + ',' + "b=" + b);

удалить или прокомментировать 2//или запустить с одним набором кода

http://jsfiddle.net/USdv8/57/

Ответ 16

В ES6 теперь есть назначение деструктуризации, и вы можете сделать:

let a = 1;
let b = 2;
[b, a] = [a, b]  // a = 2, b = 1

Ответ 17

Мы можем обменивать var следующим образом:

var val1 =  117,
    val2 = 327;

val2 = val1-val2; 
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);

Ответ 18

let a = 2, b = 4;
[b, a] = [a, b];

более подробный подход был бы

let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];

Ответ 20

Я вижу здесь олимпиаду программирования. Еще одно сложное однострочное решение:

b = (function(){ a=b; return arguments[0]; })(a);

Fiddle: http://jsfiddle.net/cherniv/4q226/

Ответ 22

(функция (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));