207

我有这两个变量:

var a = 1,
    b = 2;

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

4

21 回答 21

345

这是一个交换两个变量值的单行代码。
给定变量ab

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>

于 2013-04-24T20:39:39.250 回答
245

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

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

于 2014-09-18T10:58:37.187 回答
128

你可以这样做:

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

就可读性和可维护性而言,这是无可匹敌的(至少在 JavaScript 中)。任何维护代码的人(包括六个月后的你)都会确切地知道发生了什么。

由于这些是整数,因此您还可以使用任意数量的巧妙技巧1进行交换,而无需使用第三个变量。例如,您可以使用按位异或运算符:

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 交换算法。它的操作原理在这篇 Wikipedia 文章中进行了描述。

1 “称职的程序员完全意识到自己头骨的有限大小。因此,他以完全谦逊的态度完成任务,并避免像瘟疫这样的聪明伎俩。” — Edsger W. Dijkstra

于 2013-04-24T20:37:07.897 回答
59

不要使用下面的代码。不推荐交换两个变量的值(只需使用临时变量)。它只是展示了一个 JavaScript 技巧。

该解决方案不使用临时变量,不使用数组,只使用一个加法,而且速度很快。事实上,它有时比几个平台上的临时变量更快
它适用于所有数字,永不溢出,并处理诸如 Infinity 和 NaN 之类的边缘情况。

a = b + (b=a, 0)

它分两步工作:

  • (b=a, 0)设置b为的旧值a和产量0
  • a = b + 0设置a为旧值b
于 2013-12-11T23:04:21.460 回答
19

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

var a = 1,
    b = 2;

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

console.log('a:', a, 'b:', b); // a: 2 b: 1
于 2015-11-04T10:24:31.023 回答
18

这是一个单线,假设a并且b已经存在并且具有需要交换的值:

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

正如@Kay 提到的,这实际上比数组方式执行得更好(几乎快 2 倍)。

于 2013-11-19T01:37:11.000 回答
17

你现在终于可以做到了:

let a = 5;
let b = 10;

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

console.log(a, b);

于 2017-04-05T07:34:39.143 回答
10

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

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

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

编辑:见评论。忘了告诉这肯定只适用于整数。假设问题线程中的整数变量

于 2013-04-24T20:38:08.310 回答
10

像这样使用第三个变量:

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

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

演示- 使用第三个变量


于 2013-04-24T20:38:57.833 回答
8

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

变量 a = 1, b = 2

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

这是一个技巧

正如罗德里戈·阿西斯所说,它“可以更短”

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

演示:http: //jsfiddle.net/abdennour/2jJQ2/

于 2013-04-24T20:40:31.573 回答
5

ES6 解构:

使用数组:[a, b] = [b, a]; // my favorite

使用对象:{a, b} = {a:b, b:a}; // not bad neither

于 2018-02-13T07:34:22.883 回答
4

我们怎么能错过这些经典的oneliners

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

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

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

于 2013-05-07T17:02:16.303 回答
3

单行交换

a = a^b^(b^=(a^b));
于 2014-01-24T12:18:47.870 回答
3
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 //or 并使用一组代码运行

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

于 2015-03-26T05:17:58.393 回答
3

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

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

小提琴:http: //jsfiddle.net/cherniv/4q226/

于 2013-11-21T07:49:47.150 回答
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);
于 2015-01-13T10:35:34.510 回答
1

因为我听说这种方法运行速度较慢:

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'}
于 2020-04-16T17:55:54.613 回答
1

直到 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

进一步了解 JavaScript ES6 解构

于 2019-12-31T12:04:28.133 回答
1

我们可以使用 IIFE 交换两个值而无需额外的参数

var a = 5, b =8;
b = (function(a){ 
    return a 
}(a, a=b));

document.write("a: " + a+ "  b:  "+ b);

于 2020-04-23T11:06:49.570 回答
0

虽然之前给出了相同的答案,但这里是一个png来描述它。

可能的最简单形式:

在此处输入图像描述

于 2022-01-01T02:51:23.537 回答
0
let a = 2, b = 4;
[b, a] = [a, b];

更详细的方法是

let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
于 2018-02-13T02:11:55.437 回答