如何在JavaScript中交换两个variables

我有这两个variables:

var a = 1, b = 2; 

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

这是一个交换两个variables值的单线程。

 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> 

你可以这样做:

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

为了可读性和可维护性,这不能被打败(至less在JavaScript中)。 任何维护代码的人(包括你六个月后)都会知道到底发生了什么。

由于这些都是整数,所以也可以使用任意数量的巧妙技巧1来交换,而不使用第三个variables。 例如,你可以使用按位异或运算符:

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

这被称为XOR交换algorithm。 它的操作理论在这篇维基百科文章中有描述。

1 “主程序员完全意识到自己的头颅有限的尺寸,所以他完全谦卑地接近他的任务,避免像鼠疫这样的聪明手段。 – Edsger W. Dijkstra

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

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

不要使用下面的代码。 不是推荐的方法来交换两个variables的值(简单地使用一个临时variables )。 它只是显示一个JavaScript技巧。

该解决scheme不使用临时variables,也不使用数组,只添加一个,而且速度很快 。 事实上,它有时比几个平台上的临时variables更快
它适用于所有数字,永远不会溢出,并处理边界情况,如无穷大和NaN。

 a = b + (b=a, 0) 

它分两步工作:

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

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

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

正如@Kay提到的那样,这实际上比arrays方式performance得更好 (几乎快2倍)。

既然ES6,你也可以更优雅地交换variables:

 var a = 1, b = 2; [a, b] = [b, a]; console.log('a:', a, 'b:', b); // a: 2 b: 1 

使用像这样的第三个variables:

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

DEMO – 使用第三个variables


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

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

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

编辑:看到评论。 忘记告诉,这只适用于整数。 从问题的线程假设整数variables

由于你的问题是宝贵的“只有这个variables,而不是任何对象”,答案也将是宝贵的:

var a = 1,b = 2

 a=a+b; b=ab; a=ab; 

这是一个骗局

正如Rodrigo Assis所说,“可以缩短”

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

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

你现在终于可以做到了:

 var a = 5; var b = 10; [a, b] = [b, a]; // ES6 console.log(a, b); 

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

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

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

最后一个暴露了全局variables'_',但这不应该重要,因为典型的JavaScript惯例是使用它作为'不关心'variables。

单行交换

 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 //或者用一组代码运行

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

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

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

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

我们可以像这样交换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 

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