如何在JavaScript中交换两个变量

问题描述 投票:138回答:21

我有这两个变量:

var a = 1,
    b = 2;

我的问题是如何交换它们?只有这个变量,不是任何对象。

javascript variables swap
21个回答
291
投票

这是一个单行交换两个变量的值。

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>

6
投票

由于你的问题很珍贵“只有这个变量,而不是任何对象。”,答案也很宝贵:

var a = 1,b = 2

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

这是一个技巧 正如Rodrigo Assis所说,它“可以更短”

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

但是:ぁzxswい


6
投票

你现在终于可以做到:


6
投票

ES6解构:

使用数组:var a = 5; var b = 10; [a, b] = [b, a]; // ES6 console.log(a, b);

使用对象:[a, b] = [b, a]; // my favorite


3
投票

我们怎么能错过这些经典的单人衬里

{a, b} = {a:b, b:a}; // not bad neither

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

最后一个公开了全局变量'_',但这并不重要,因为典型的javascript约定是将它用作'不关心'变量。


2
投票

单线交换

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

2
投票
a = a^b^(b^=(a^b));

删除或评论2 //或者并使用一组代码运行

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中,现在有解构赋值,你可以这样做:

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

1
投票

我在这里看到奥林匹克运动会的编程。一个更棘手的单线解决方案:

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

小提琴:b = (function(){ a=b; return arguments[0]; })(a);


1
投票

我们可以像这样交换var:

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

1
投票
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];

138
投票

ES6(Firefox和Chrome已经支持它(解构分配数组匹配)):

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

0
投票

这很简单,使用ES6数组解构语法,这是let a = 2, b = 4; a = [a, b]; b = a[0]; a = a[1]; 更多信息,请参阅此链接[y, x] = [x, y]


-4
投票

(函数(A,B){b = A; a = B;})(parseInt(a),parseInt(b));


117
投票

你可以这样做:

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

为了可读性和可维护性,这是不可能的(至少在JavaScript中)。任何维护代码的人(包括你从现在起六个月后)都会确切知道发生了什么。

因为这些是整数,所以你也可以使用任意数量的聪明技巧来交换而不使用第三个变量。例如,您可以使用按位xor运算符:

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

这称为XOR交换算法。它的运作理论在this Wikipedia article中有所描述。

1“有能力的程序员完全清楚他自己头骨的大小有限。因此,他完全谦虚地接近他的任务,并避免像瘟疫一样聪明的伎俩。” - Edsger W. Dijkstra


56
投票

请勿使用以下代码。这不是交换两个变量的值的推荐方法(简单地说use a temporary variable)。它只是展示了一个JavaScript技巧。

这个解决方案不使用临时变量,没有数组,只使用一个加法,而且它是fast。事实上,它是sometimes faster than a temporary variable on several platforms。 它适用于所有数字,从不溢出,并处理边缘情况,如无限和NaN。

a = b + (b=a, 0)

它分两步进行:

  • (b=a, 0)b设置为a的旧值并产生0
  • a = b + 0a设置为b的旧值

17
投票

这是一个单行,假设ab已经存在并且需要交换值:

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

正如@Kay所提到的,这实际上比阵列方式更好(几乎快2倍)。


13
投票

从ES6开始,您还可以更优雅地交换变量:

var a = 1,
    b = 2;

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

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

9
投票

像这样使用第三个变量:

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
投票

您可以使用临时交换变量或XOR。

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

这只是一个基本的逻辑概念,适用于支持XOR操作的每种语言。

编辑:查看评论。忘了说这只能用整数来确定。假设问题的线程中的整数变量


8
投票

ES6 +方法:从ES6开始,您可以更优雅地交换变量。您可以使用解构赋值数组匹配。这很简单。 var a = 10 b = 20;

[a,b] = [b,a]

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

© www.soinside.com 2019 - 2024. All rights reserved.