Ответы:
Вот одна строка для обмена значениями двух переменных.
Заданы переменные 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>
[a, b] = [b, a];
.
Invalid left-hand side in assignment
ошибку.
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:
let a = 1, b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log('a is now:', a);
console.log('b is now:', b);
Это называется алгоритм обмена XOR. Его теория действия описана в этой статье Википедии .
1 «Компетентный программист полностью осознает ограниченный размер своего собственного черепа. Поэтому он подходит к своей задаче с полным смирением и избегает хитрых уловок, таких как чума». - Эдсгер В. Дейкстра
ToInt32
внутренний метод - см. Раздел 11.10 стандарта ECMAScript ). Он не дает правильных результатов для нецелых числовых значений. Он также преобразует нечисловые значения в 32-разрядные целые числа. Если вы начинаете с a = "hi"
и b = "there"
, вы в конечном итоге с a == 0
и b == 0
.
typeof a == 'boolean'
или a === false
, например. Действительные числа работают, за исключением того, что они смещены к нулю, а не округлены до ближайшего целого числа.
Не используйте код ниже. Это не рекомендуемый способ обмена значениями двух переменных (для этого просто используйте временную переменную ). Это просто показывает трюк JavaScript.
Это решение не использует никаких временных переменных, массивов, только одно сложение, и это быстро . На самом деле, это иногда быстрее, чем временная переменная на нескольких платформах .
Он работает для всех чисел, никогда не переполняется и обрабатывает крайние случаи, такие как Infinity и NaN.
a = b + (b=a, 0)
Работает в два этапа:
(b=a, 0)
устанавливает b
старое значение a
и дает0
a = b + 0
устанавливает a
старое значениеb
,
, и он был перенесен для установки права приоритета. Оператор запятой оценивает оба своих аргумента (в этом случае b=a
и 0
) и возвращает последний (в этом случае 0
). Так что здесь, это имеет эффект установки нового b
на старое значение a
, уступая при этом 0
.
Вот одна строка, предполагающая a
и b
уже существующая и имеющая значения, которые необходимо поменять местами:
var c=a, a=b, b=c;
Как упомянул @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
Теперь вы можете, наконец, сделать:
let a = 5;
let b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
Вы можете использовать временную переменную подкачки или XOR.
a = a ^ b
b = a ^ b
a = a ^ b
Это просто базовая логическая концепция, которая работает на любом языке, поддерживающем операцию XOR.
редактировать: см. комментарии. Забыл сказать, что это работает точно только с целым числом. Предполагается целочисленные переменные из потока вопроса
Вы можете использовать назначение деструктурирования ES6 следующим образом:
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b); // a = 20, b = 10
Поскольку ваш вопрос был ценным «Только эти переменные, а не какие-либо объекты», ответ будет также ценным:
var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
это трюк
И, как сказал Родриго Ассис, он "может быть короче"
b=a+(a=b)-b;
ES6 Разрушение:
Используя массив: [a, b] = [b, a]; // my favorite
Используя объект: {a, b} = {a:b, b:a}; // not bad neither
Как мы могли пропустить эти классические 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 = (_=b,b=a,_);
_
? Почему оно не нуждается в декларации?
Я вижу вид олимпиады по программированию здесь. Еще одно хитрое однострочное решение:
b = (function(){ a=b; return arguments[0]; })(a);
Скрипка: http://jsfiddle.net/cherniv/4q226/
arguments
, просто сделайте b = (function (x){ return x; })(a, a=b)
.
arguments
список также будет переменной.
a
к arguments[0]
пропусканием его в качестве параметра.
arguments
и его назначение происходит "за кадром"
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 // или и запустите с одним набором кода
Мы можем поменять var следующим образом:
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
В ES6 теперь есть назначение деструктурирования, и вы можете сделать:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
let a = 2, b = 4;
[b, a] = [a, b];
более подробный подход будет
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
Это очень просто, используйте синтаксис деструктуризации массива ES6, который [y, x] = [x, y]
для получения дополнительной информации см. По этой ссылке https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
До ES5, чтобы поменять местами два числа, вы должны создать временную переменную, а затем поменять ее местами. Но в ES6 очень просто поменять два числа с помощью деструктуризации массива. Смотрите пример.
let x,y;
[x,y]=[2,3];
console.log(x,y); // return 2,3
[x,y]=[y,x];
console.log(x,y); // return 3,2
Потому что я слышал, что этот метод работает медленнее:
b = [a, a = b][0];
Если вы планируете хранить ваши переменные в объекте (или массиве), эта функция должна работать:
function swapVars(obj, var1, var2){
let temp = obj[var1];
obj[var1] = obj[var2];
obj[var2] = temp;
}
Использование:
let test = {a: 'test 1', b: 'test 2'};
console.log(test); //output: {a: 'test 1', b: 'test 2'}
swapVars(test, 'a', 'b');
console.log(test); //output: {a: 'test 2', b: 'test 1'}
Мы можем использовать IIFE для замены двух значений без дополнительного параметра
var a = 5, b =8;
b = (function(a){
return a
}(a, a=b));
document.write("a: " + a+ " b: "+ b);
Деструктуризация массива ES6 используется для замены двух переменных. См пример
var [x,y]=[1,2];
[x,y]=[y,x];
Более простой способ возможен с:
x === 1
и y === 2
; Но после того, как деструктуризации, x
есть y
, то есть 2
, и y
есть x
, то есть 1
.
Поменять местами
let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;
Перестановка одной строки "используя массив"
[a, b] = [b, a]
(функция (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));