我有这两个变量:
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进行交换,而无需使用第三个变量。例如,您可以使用按位异或运算符:
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 “称职的程序员完全意识到自己头骨的有限大小。因此,他以完全谦逊的态度对待自己的任务,并避免像瘟疫一样聪明的把戏。” — Edsger W. Dijkstra
不要使用下面的代码。这不是交换两个变量值的推荐方法(只需为此使用临时变量)。它只是展示了一个 JavaScript 技巧。
这个解决方案不使用临时变量,不使用数组,只添加一个,而且速度很快。事实上,它有时比多个平台上的临时变量更快。
它适用于所有数字,从不溢出,并处理诸如 Infinity 和 NaN 之类的边缘情况。
a = b + (b=a, 0)
它分两步工作:
(b=a, 0)
设置b
为旧值a
并产生0
a = b + 0
设置a
为旧值b
从 ES6 开始,您还可以更优雅地交换变量:
var a = 1,
b = 2;
[a, b] = [b, a];
console.log('a:', a, 'b:', b); // a: 2 b: 1