如何在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 + 0
将a
设置为旧的b
值
这里是一个单行,假设a
和b
已经存在,并且需要交换值:
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 //或者用一组代码运行
我在这里看到了一种编程奥林匹克。 一个更棘手的单线解决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));