【JavaScript实战技巧系列】-你知道几种交换两个值的方法?

121 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

大家好,我是程序员_随心,希望能够通过自己的学习输出给你带来帮助。

题目:

交换以下两个值:

let a = 2;
let b = 7;

解法有三:

方法一:建立额外变量

let a = 2;
let b = 7;

let c = a;
a = b;
b = c;

console.log(a); // 7
console.log(b); // 2

方法二:利用es6的解构赋值

let a = 2;
let b = 7;

[a , b] = [b, a];

console.log(a); // 7
console.log(b); // 2

方法三:利用按位异或(^)操作符

let a = 2;
let b = 7;

a ^= b;
b ^= a;
a ^= b;

console.log(a); // 7
console.log(b); // 2

剖析算法三,即按位异或

第一二中方式想必大家都很清楚,那么我们来详细的讲解下第三种方式。

这里首先我们讲解下什么是按位异或

按位异或用托字符(^)表示,有两个操作数,以下为按位异或的真值表

第一个数的位第二个数的位结果
101
110
000
011

ok,我们讲解下上面👆🏻结果的原理:

let a = 2;
let b = 7;
// 交换两个值的步骤
a ^= b;
b ^= a;
a ^= b;


// step1 a ^= b;
a  2 = 0000 0000 0000 0000 0000 0000 0000 0010
b  7 = 0000 0000 0000 0000 0000 0000 0000 0111
----------------------------------------------
res  = 0000 0000 0000 0000 0000 0000 0000 0101
// 此时a为 5


// step2 b ^= a;
b  7 = 0000 0000 0000 0000 0000 0000 0000 0111
a  5 = 0000 0000 0000 0000 0000 0000 0000 0101
----------------------------------------------
rea  = 0000 0000 0000 0000 0000 0000 0000 0010
// 此时b为 2

// step3 a ^= b;
a  5 = 0000 0000 0000 0000 0000 0000 0000 0101
b  2 = 0000 0000 0000 0000 0000 0000 0000 0010
----------------------------------------------
res  = 0000 0000 0000 0000 0000 0000 0000 0111
// 此时a为 7

// 至此我们可以清楚看到交换过来了。

最后

您的每一个点赞及评论都是对我坚持写作最大的支持! 另外希望各位朋友和我交流讨论,如有不对的地方,更希望批评指正!

我是程序员_随心,希望能够通过自己的学习输出给你带来帮助。