我有这两个变量:
var a = 1,
b = 2;
我的问题是如何交换它们?只有这个变量,不是任何对象。
这是一个单行交换两个变量的值。
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
a=a+b;
b=a-b;
a=a-b;
这是一个技巧 正如Rodrigo Assis所说,它“可以更短”
b=a+(a=b)-b;
但是:ぁzxswい
你现在终于可以做到:
ES6解构:
使用数组:var a = 5;
var b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
使用对象:[a, b] = [b, a]; // my favorite
我们怎么能错过这些经典的单人衬里
{a, b} = {a:b, b:a}; // not bad neither
和
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
最后一个公开了全局变量'_',但这并不重要,因为典型的javascript约定是将它用作'不关心'变量。
单线交换
var a = 1, b = 2
a = (_=b,b=a,_);
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);
在ES6中,现在有解构赋值,你可以这样做:
http://jsfiddle.net/USdv8/57/
我在这里看到奥林匹克运动会的编程。一个更棘手的单线解决方案:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
小提琴:b = (function(){ a=b; return arguments[0]; })(a);
我们可以像这样交换var:
http://jsfiddle.net/cherniv/4q226/
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];
ES6(Firefox和Chrome已经支持它(解构分配数组匹配)):
let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
这很简单,使用ES6数组解构语法,这是let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
更多信息,请参阅此链接[y, x] = [x, y]
(函数(A,B){b = A; a = B;})(parseInt(a),parseInt(b));
你可以这样做:
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
请勿使用以下代码。这不是交换两个变量的值的推荐方法(简单地说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 + 0
将a
设置为b
的旧值这是一个单行,假设a
和b
已经存在并且需要交换值:
var c=a, a=b, b=c;
正如@Kay所提到的,这实际上比阵列方式更好(几乎快2倍)。
从ES6开始,您还可以更优雅地交换变量:
var a = 1,
b = 2;
[a, b] = [b, a];
console.log('a:', a, 'b:', b); // a: 2 b: 1
像这样使用第三个变量:
var a = 1,
b = 2,
c = a;
a = b; // must be first or a and b end up being both 1
b = c;
DEMO - 使用第三个变量
您可以使用临时交换变量或XOR。
a = a ^ b
b = a ^ b
a = a ^ b
这只是一个基本的逻辑概念,适用于支持XOR操作的每种语言。
编辑:查看评论。忘了说这只能用整数来确定。假设问题的线程中的整数变量
ES6 +方法:从ES6开始,您可以更优雅地交换变量。您可以使用解构赋值数组匹配。这很简单。 var a = 10 b = 20;
[a,b] = [b,a]
console.log(a,b)// 20 10