不借助中间变量交换两个变量的值
比如 let a = 1, b = 2; 交换 a,b 的值
答案:
1.利用加法
let a = 1,b = 2;
b = a + b;
a = b - a;
b = b - a;
2.利用减法,可以解决加法溢出的风险
let a = 1;
let b = 2;
b = a - b;
a = a - b;
b = b + a;
3.利用es6 的解构赋值
let a = 1;
let b = 2;
[a,b] = [b,a];
4.按位异或 ^,用到按位异或这个位运算的性质,即相同则为 0 ,不同则为 1
对于两个数字,a 和 b,则有 a^a^b 就等于 b。我们利用这个性质来进行转换
let a = 1,b = 2;
b = a ^ b;
a = a ^ b;//a = a ^ a ^ b;
b = a ^ b;//b = a ^ b ^ b;
过程解释:
a = > 01
b => 10
a ^ a - > 01 ^ 01 肯定是 00 ,因为相同为 0
a ^ a ^ b -> 00 ^ 10 还是 10 ->b
a ^ a ^ b ->
(1)过程: 01 ^ 10 ^ 10 -> 11 ^ 10 -> 01 ->a
(2)其实这里涉及到数学的异或运算符性质:交换律:a ^ b ^ c <=> a ^ c ^ b
还有其他性质:任何数于 0 异或为任何数, 0 ^ n => n,相同的数异或为 0: n^n - >0
5.逗号表达式
逗号表达式是将两个及以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。利用这个性质,先完成一次赋值操作,然后将赋值操作的返回值变为 0 ,就可以了
let a = 1, b = 2;
a = b + ((b=a),0);