var a = 6;
var b = 5;
// 如何不借助第三个变量完成上面的交换
1、通过数学计算解决
a = a + b;
b = a - b;
a = a - b;
console.log(a,b);
a = a + b; 此时 a 为 a和b值的混合,再用这个混合去减去b就是原来的a;在复制给b;此时b就是原来的a;混合减去现在b(及原来的a)就得到了b,再赋值给a,就完成了交换。
2、通过异或解决
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log(a,b);
// 异或
// 0 1 1 0 a
// 0 1 0 1 b
// ------------------ 取异或
// 0 0 1 1 赋值给a(混合)
// 0 1 0 1 b
// ------------------ 取异或
// 0 1 1 0 原来的a,赋值给b
// 0 0 1 1 混合
// ------------------ 取异或
// 0 1 0 1 赋值给a 完成交换
^ 为异或 要转成二进制,对两个二进制数的每一位相同取0,不同取1;题中a(6)转为二进制为0110,b(5)转为二进制为0101;去异或为 0011 赋值给a,也是a,b 的混合,这时这个混合表示这俩数二进制的差异。再对 此时的a和b进行异或 得 0110 ;这个值和原来a的值一样;所以就把a 赋值给了b;再用混合和现在的b去异或,得到的就是原来的b;
3、上面的方式只能针对数字交换进行,想要针对所有数据类型可以利用Es6中的结构;
[b , a] = [a ,b]