У меня есть две переменные:
var a = 1,
b = 2;
Мой вопрос в том, как поменять их? Только эти переменные, а не любые объекты.
У меня есть две переменные:
var a = 1,
b = 2;
Мой вопрос в том, как поменять их? Только эти переменные, а не любые объекты.
Здесь однострочник для обмена значениями двух переменных.
Учитывая переменные и 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>
ES6 (Firefox и Chrome уже поддерживают его (сопоставление массивов назначений)):
let a = 5, b = 6;
[a, b] = [b, a];
console.log('${a} ${b}');
Вы можете сделать это:
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 "Компетентный программист полностью осознает ограниченный размер своего собственного черепа. Поэтому он подходит к своей задаче с полным смирением и избегает умных трюков, таких как чума". — Эдсгер В. Дейкстра
Не используйте приведенный ниже код. Не рекомендуется менять значения двух переменных (просто использовать для этого временную переменную). Он просто показывает трюк 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;
DEMO - использование третьей переменной
Метод ES6+: Начиная с ES6, вы можете поменять переменные более элегантно. Вы можете использовать деструктуризацию сопоставления массива присвоения Это просто. var a = 10 b = 20;
[a, b] = [b, a]
console.log(a, b)//20 10
Вы можете использовать временную переменную swap или XOR.
a = a ^ b
b = a ^ b
a = a ^ b
Это всего лишь базовая логическая концепция и работает на всех языках, поддерживающих работу XOR.
изменить: посмотреть комментарии. Забыл сказать, что это работает только с целым числом. Предположим, что целочисленные переменные из вопросной темы
Теперь вы можете:
var a = 5;
var b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
ES6 Destructuring:
Использование массива: [a, b] = [b, a]; // my favorite
Использование объекта: {a, b} = {a:b, b:a}; // not bad neither
Поскольку ваш вопрос был драгоценным "Только эти переменные, а не любые объекты", ответ будет также ценным:
var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
это трюк
И как сказал Родриго Ассис, он "может быть короче"
b=a+(a=b)-b;
Как мы можем пропустить эти классические 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//или запустить с одним набором кода
В ES6 теперь есть назначение деструктуризации, и вы можете сделать:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
Мы можем обменивать 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];
Вы можете использовать ES6 деструктурирующее назначение следующим образом:
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b); // a = 20, b = 10
Я вижу здесь олимпиаду программирования. Еще одно сложное однострочное решение:
b = (function(){ a=b; return arguments[0]; })(a);
Это очень просто, используйте синтаксис деструктуризации массива ES6, который [y, x] = [x, y]
для получения дополнительной информации обратитесь к этой ссылке https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Операторы/Destructuring_assignment
(функция (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));