如何在JavaScript中交换两个变量

时间:2013-04-24 20:35:13

标签: javascript variables swap

我有两个变量:

var a = 1,
    b = 2;

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

27 个答案:

答案 0 :(得分:286)

这是一个单行交换两个变量的值。

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>

答案 1 :(得分:132)

ES6(Firefox和Chrome已经支持它(Destructuring Assignment 数组匹配)):

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

答案 2 :(得分:116)

你可以这样做:

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

为了可读性和可维护性,这是不可能的(至少在JavaScript中)。任何维护代码的人(包括你从现在起六个月后)都会确切地知道发生了什么。

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

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

这称为XOR交换算法。其运作理论在this Wikipedia article中有描述。

1 “有能力的程序员完全清楚自己头骨的大小有限。因此,他完全谦虚地接近他的任务,并避免像瘟疫一样聪明的伎俩。” em> - Edsger W. Dijkstra

答案 3 :(得分:56)

请勿使用以下代码。它是交换两个变量值的推荐方法(简称为use a temporary variable)。它只显示了一个JavaScript技巧。

此解决方案不使用临时变量,不使用数组,只使用一个加法,并且它是fast。 实际上,它是 sometimes faster than a temporary variable on several platforms
它适用于所有数字,从不溢出,并处理边缘情况,如Infinity和NaN。

a = b + (b=a, 0)

它分两步进行:

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

答案 4 :(得分:16)

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

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

正如@Kay所提到的,这个实际上比阵列方式表现更好(差不多快2倍)。

答案 5 :(得分:13)

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

var a = 1,
    b = 2;

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

console.log('a:', a, 'b:', b); // a: 2 b: 1

答案 6 :(得分:9)

使用第三个变量:

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

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

DEMO - 使用第三个变量


答案 7 :(得分:8)

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

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

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

编辑:查看评论。忘了说这只能用整数来确定。假设问题的线程

中的整数变量

答案 8 :(得分:7)

ES6 +方法: 从ES6开始,您可以更优雅地交换变量。您可以使用解构分配数组匹配。很简单。 var a = 10     b = 20;

[a,b] = [b,a]

console.log(a,b)// 20 10

答案 9 :(得分:6)

因为你的问题很珍贵&#34;只有这个变量,而不是任何对象。 &#34;,答案也很珍贵:

var a = 1,         b = 2

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

这是一招(
正如罗德里戈·阿西斯所说,它可以缩短&#34;

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

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

答案 10 :(得分:6)

你现在终于可以了:

var a = 5;
var b = 10;

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

console.log(a, b);

答案 11 :(得分:6)

ES6解构:

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

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

答案 12 :(得分:4)

您可以这样使用 ES6 destructuring assignment

let a = 10;
let b = 20;

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

console.log(a, b); // a = 20, b = 10

答案 13 :(得分:3)

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

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

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

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

答案 14 :(得分:2)

单线交换

a = a^b^(b^=(a^b));

答案 15 :(得分: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);

删除或评论2 //或and并使用一组代码

运行

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

答案 16 :(得分:2)

ES6数组解构用于交换两个变量。 参见示例

var [x,y]=[1,2];
[x,y]=[y,x];

使用以下更简单的方法:

x === 1y === 2; 但是在解构之后,xy,即2,而yx,即1

答案 17 :(得分:2)

现在在ES6中有解构分配,您可以这样做:

let a = 1;
let b = 2;
[b, a] = [a, b]  // a = 2, b = 1

答案 18 :(得分:1)

使用按位交换

let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;

单行交换“使用数组”

[a, b] = [b, a]

答案 19 :(得分:1)

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

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

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

答案 20 :(得分:1)

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

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

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

答案 21 :(得分:1)

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

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

如果您打算将var存储在一个对象(或数组)中,则此功能应该起作用:

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'}

答案 22 :(得分:1)

let a = 2, b = 4;
[b, a] = [a, b];

更详细的方法

let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];

答案 23 :(得分:1)

我们可以像这样交换var:

var val1 =  117,
    val2 = 327;

val2 = val1-val2; 
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);

答案 24 :(得分:0)

直到ES5,要交换两个数字,您必须创建一个temp变量,然后对其进行交换。 但是在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

答案 25 :(得分:0)

这非常简单,请使用 ES6 数组解构语法 这是[y, x] = [x, y] 有关更多信息,请参见此链接https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

答案 26 :(得分:-3)

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