JavaScript中交换变量的一些方法
1.使用临时变量:
这是最简单的一种方法,基本上每一个人入门编程都会接触。
var a = 1,b = 2,temp;
temp = a;
a = b;
b = tmp;
console.log('a : ',a);
console.log('b : ',b);
2.使用加减法让两个变量之间产生关联:
这是一种比较巧妙的方法,我们使用一些简单的运算符,无需第三个变量,让两个变量之间产生了关联,下面是代码:
var a = 1,b = 2;
a = a + b;
b = a - b;
a = a - b;
console.log('a : ',a);
console.log('b : ',b);
然而这种方法的缺点就是只能交换数字,无法交换字符串等。
3.使用对象交换:
在这里我们把a和b的值存放在一个对象中,通过改变对象a的属性来进行交换,简单也很容易理解(ps:属性名a、b和变量a、b并没有半毛钱的关系,萌新需要注意)。
var a = 1,b = 2;
a = {
a : b,
b : a
};
b = a.b;
a = a.a;
console.log(a);//2
console.log(b);//1
4.使用数组进行交换:
这种交换方式与使用对象进行变量交换的思想一样,这里就不赘述了,下面贴代码:
var a = 1,b = 2;
a = [a,b];
b = a[0];
a = a[1];
console.log(a);//2
console.log(b);//1
5.使用异或运算:
该方法只适用于数字,对位运算不熟悉的同学建议先补一补位运算的基础知识再来看这个方法,可以先跳过,下面是代码:
var a = 1; // 二进制:0001
var b = 2; // 二进制:0010
a = a ^ b; // 计算结果:a = 0011, b = 0010
b = a ^ b; // 计算结果:a = 0011, b = 0001
a = a ^ b; // 计算结果:a = 0010, b = 0001
console.log(a)//2;
console.log(b)//1;
如果对位运算比较熟悉,看到这段代码,脑海中就应该想到怎么简化了:
var a = 1;
var b = 2;
a = ( b = (a ^= b) ^ b) ^ a;
console.log(a);
console.log(b);
6.利用try catch进行交换:
虽然是一个好方法,但是实际中使用比较少。
var a = 1,b = 2;
a = (function() {
try {
return b;
} finally {
b = a;
}
})();
console.log(a);//2
console.log(b);//1
这里有一个坑,很多朋友可能会认为执行try就直接return b了,为什么还能交换变量?其实在JavaScript中,确实是先执行了try,但是因为有finally的存在,程序并不会马上return b,而是继续执行finally中的代码,此时b变成了1,等到finally执行完毕之后再return b(注意:这里return 的b的值并不是1,而是2,接下来解释为什么是2)。
程序运行时,在try中,要返回的结果已经准备好了,就在这个时候,程序跳到了finally(不管try中是否抛出异常,finally中的代码都会执行),执行完finally后,再取出结果,finally对b进行了改变,但不会影响返回的结果。
7.ES6中的结构赋值
先来解释一波解构赋值。
解构赋值:允许你使用类似数组或对象字面量的语法将数组和对象的属性赋给各种变量。这种赋值的优势是语法极度简洁,同时还比传统的属性访问方法更为清晰。
不太了解的可以去先MDN上看一下有关阮一峰关于解构赋值的理解,讲的还是很清晰的,这里放一个链接:http://es6.ruanyifeng.com/#docs/destructuring。
let a = 1,b = 2;
[a, b] = [b, a];
console.log(a, b);//1,2
这也是一种很简单的方法。
8.某位不知名的大神想出来的办法(利用运算符的优先级):
个人认为最厉害的方法,所以把它放到了最后,
代码非常简单暴力,也是一种很好用的方法:
var a = 1,b = 2;
a = [b, b = a][0];//我可能想几天也想不出来
console.log(a,b);//2,1
根据运算符的优先级程序会先执行b=a,此时b变为了2,然后根据索引找到了a的值[1,2][0],即1。
到这里为止,我所了解的JavaScript中的交换变量的方法就写完了,如有其他方法,欢迎大家补充。