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"компетентный программист полностью осознает ограниченности собственного черепа. Поэтому он подходит к своей задаче с полным смирением и избегает таких хитрых трюков, как чума." - Edsger W. Dijkstra
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, это на самом деле работает лучше чем массив способом (почти в 2 раза быстрее).
начиная с 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: см. комментарии. Забыл сказать, что это работает наверняка только с целым числом. Предполагается, что целочисленные переменные из потока вопроса
поскольку ваш вопрос был драгоценным "только эти переменные, а не какие-либо объекты. ", ответ будет также драгоценным:
var a = 1, b = 2
a=a+b; b=a-b; a=a-b;
это трюк
И как сказал Родриго Ассис, это "может быть короче"b=a+(a=b)-b;
теперь вы можете, наконец, сделать:
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'.
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 / / или и запустить с одним набором кода
в ES6 теперь есть назначение деструктурирования, и вы можете сделать:
let a = 1; let b = 2; [b, a] = [a, b] // a = 2, b = 1
Я вижу здесь своего рода олимпиаду по программированию. Еще одно хитрое решение:
b = (function(){ a=b; return arguments[0]; })(a);
мы можем поменять 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];
Comments