大家在项目中肯定有遇到交换两个变量值的情景,这里就总结一下交换两个变量的方法。如果大佬有更多优秀的方案,还请不吝赐教。
1、创建一个中间值变量转接
这应该是大家能想到的最简单的处理方法,完全可以解决问题,但是需要开辟新内存来创建新的变量。
let a = 1
let b = 2
let c
c = a
a = b
b = c
----------
// 结果为 a = 2 b = 1
2、利用es6的解构赋值
这个方法不需要创建一个新的中间值变量即可交换。代码也少,阅读起来更清晰。
let a = 1
let b = 2
[b,a] = [a,b]
----------
// 结果为 a = 2 b = 1
3、利用异或运算符(^)。
这个方法比较奇特,先看代码,再细说。
let a = 1
let b = 2
a = a ^ b
b = a ^ b
a = a ^ b
----------
// 结果为 a = 2 b = 1
这个方法是不是看着很秀,接下来就请耐心读下去。 理解这个方法,需要先知道异或操作符(^)的运算法则:
a ^ a = 0
//归零律
a ^ 0 = a
//恒等律
a ^ b = b ^ a
//交换律
a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c
//结合律
好了,接下来利用上述运算法则来解释一下方法3吧。请看注释。
let a = 1
let b = 2
a = a ^ b //此时a=1^2 ,b=2
b = a ^ b //此时b=1^2^2。根据结合律可知 b=1^(2^2),而2^2根据归零律为0,那么b=1^0=1。 a依旧为1^2
a = a ^ b //此时b=1,a=1^2^1,根据交换律1^2^1=1^1^2,根据归零律与恒等律可知:1^1^2=0^2=2。所以a=2
不得不说,这个方法抖机灵的成分居多,且两个变量必须为数字或者能转化为合法数字的类型。
说一个能利用异或解决的算法题:
一个数组,里面都是数字,只有一种数字出现了奇数次,其它都出现了偶数次,求这个奇数次的数字。
例如:[1,2,3,3,1,2,2,3,2]输出结果为3
function getNum(arr){
let num = 0
for(let i=0;i<arr.length;i++){
num = num ^ arr[i]
}
return num
}
越努力,越幸运。