如何在JavaScript中交换两个变量

如何在JavaScript中交换两个变量,javascript,variables,swap,Javascript,Variables,Swap,我有两个变量: var a = 1, b = 2; 我的问题是如何交换它们?只有这些变量,而不是任何对象。您可以执行以下操作: var a = 1, b = 2, tmp; tmp = a; a = b; b = tmp; 就可读性和可维护性而言,这是无与伦比的(至少在JavaScript中是如此)。任何维护代码的人(包括六个月后的你)都会确切地知道发生了什么 由于这些都是整数,您还可以使用任意数量的巧妙技巧1进行交换,而无需使用第三个变量。例如,您可以使用按位异或运

我有两个变量:

var a = 1,
    b = 2;
我的问题是如何交换它们?只有这些变量,而不是任何对象。

您可以执行以下操作:

var a = 1,
    b = 2,
    tmp;
tmp = a;
a = b;
b = tmp;
就可读性和可维护性而言,这是无与伦比的(至少在JavaScript中是如此)。任何维护代码的人(包括六个月后的你)都会确切地知道发生了什么

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

设a=1,b=2;
a=a^b;
b=a^b;
a=a^b;
log('a现在是:',a);

log('b现在是:',b)可以使用临时交换变量或XOR

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


编辑:查看评论。忘了告诉我,这肯定只适用于整数。假设问题线程中的整数变量使用第三个变量,如下所示:

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

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

-使用第三个变量



这里有一个单行程序来交换两个变量的值。
给定变量
a
b

b = [a, a = b][0];
演示如下:

var a=1,
b=2,
output=document.getElementById('output');
output.innerHTML=“原件:“+a+”、“+b+”

”; b=[a,a=b][0]; output.innerHTML+=“交换:“+a+”、“+b+”


因为你的问题很宝贵“只有这个变量,没有任何对象”,答案也很宝贵:

var a=1, b=2

a=a+b;
b=a-b;
a=a-b;
这是个骗局

正如罗德里戈·阿西斯所说,它“可以更短”

演示:

我们怎么会错过这些经典的一行呢

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


最后一个变量公开了全局变量“u”,但这并不重要,因为典型的javascript约定是将其用作“不在乎”变量。

这里有一个单行程序,假设
a
b
已经存在,并且有需要交换的值:

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

正如@Kay所提到的,这种方式实际上比数组方式(几乎快2倍)的性能要好。

我在这里看到了类似的编程奥林匹克。还有一个棘手的单线解决方案:

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

小提琴:不要使用下面的代码。交换两个变量的值不是推荐的方法(仅此而已)。它只是显示了一个JavaScript技巧。

这个解决方案不使用临时变量,不使用数组,只使用一个加法,而且非常简单。 事实上是这样。
它适用于所有数字,从不溢出,并处理诸如无穷大和NaN等边缘情况

a = b + (b=a, 0)
它分两步工作:

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

a = a^b^(b^=(a^b));
ES6(Firefox和Chrome已经支持它(解构分配 数组匹配):

设a=5,b=6;
[a,b]=[b,a];

log(`${a}${b}`)我们可以像这样交换var:

var val1 =  117,
    val2 = 327;

val2 = val1-val2; 
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
删除或注释2//or并使用一组代码运行


自ES6以来,您还可以更优雅地交换变量:

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

您现在终于可以执行以下操作:

设a=5;
设b=10;
[a,b]=[b,a];//ES6
控制台日志(a,b)
更详细的方法是

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

ES6解构:

使用数组:
[a,b]=[b,a];//我最喜欢的


使用对象:
{a,b}={a:b,b:a};//也不错

在ES5之前,要交换两个数字,必须创建一个临时变量,然后交换它。 但在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

因为我听说这种方法运行较慢:

b = [a, a = b][0];
如果计划将变量存储在对象(或数组)中,则此函数应该可以工作:

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

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

var a=5,b=8;
b=(函数(a){
归还
}(a,a=b));

文件。书写(“a:+a+”b:+b)…适用于编程面试和其他一般琐事案例。但请注意,在现实生活中,这是一种相当愚蠢的交换价值的方式。首先,在JS中,它只适用于整数。@Kay“过去30年中不是真实的东西”是什么意思?只要有意义,我就使用位运算符,这实际上是非常常见的(例如,切换未知布尔值)@php\u外科医生:异或交换已经很久没有用了。几十年来,内存一直并没有那个么稀缺,而现代CPU使用临时内存的速度实际上比使用XOR的速度要快。(寄存器的相互依赖性使得管道化变得相当困难。)再加上它的可读性较差,以及:P@cHao位运算符始终是(而且是目前为止)我机器上速度最快的:@php\u我稍微更改了fiddle,这样编译器就不能将变量标记为dead。temp var解决方案现在比xor交换解决方案快1/4。错误与@DmiN的答案相同。您在哪里找到错误?事实并非如此honorable@AbdennourToumi我想Kay指的是你的答案只适用于整数的事实。@showdev:请再看一次问题:“只有这个变量,没有任何对象”……我的答案和问题一样珍贵。我请你在评论上加上标记。我重复一遍:这是不光彩的。这段对话很奇怪@AbdennourTOUMI-变量与整数不同。您可以使用指向对象、字符串、函数、null等的变量+1。但是最短的版本将出现在ECMAScript 6中:
[a,b]=[b,a]
@Kay:使用数组而不是第三个变量似乎要慢得多:不过我只是在Chrome上测试过。我还不能测试ECMAScript 6版本,因为它目前在赋值中给出了一个
无效的左侧
错误。@FrançoisWahl说得不错。我认为这里的大多数答案都是有效的,而且是相当公平的
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
b = [a, a = b][0];
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'}