Как поменять две переменные в JavaScript

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

var a = 1,
    b = 2;

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

20 ответов


вот однострочный, чтобы поменять значения двух переменных.

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>

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

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


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

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

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

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

a = b + (b=a, 0)

он работает в два шага:

  • (b=a, 0) наборы b к старому значению a и урожайности 0
  • a = b + 0 наборы a к старому значению b

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

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

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


начиная с ES6, вы также можете менять переменные более элегантно:

var a = 1,
    b = 2;

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

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

используйте третью переменную, например:

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

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

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



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

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

Это просто базовая логическая концепция и работает на каждом языке, который поддерживает операцию XOR.

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


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

var a = 1, b = 2

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

это трюк

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

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

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


теперь вы можете, наконец, сделать:

var a = 5;
var b = 10;

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

console.log(a, b);

ES6 в деконструкцию:

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

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


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

[a, b] = [b, a]


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

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

и

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

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


замена одной строки

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

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/


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

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

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

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

Скрипка:http://jsfiddle.net/cherniv/4q226/


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

var val1 =  117,
    val2 = 327;

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

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

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

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

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