前言
这道题目是最近在面试过程中遇到的。看到这个标题,想必很多同学心里碎碎念:不就是交换变量,这也算有趣?不急,且看后面的文章娓娓道来。
常规方法
面试官:有a和b两个变量,实现两个变量交换的代码
内心os:这么简单的题,简直信手拈来啊(偷笑
一拿到这个题,肯定是洋洋洒洒写下如下代码:
var t;
t = a;
a = b;
b = t;
面试官:你这个使用了临时变量,有没有不使用临时变量方法
内心os:简单,这还能难得倒我。
先装作若有所思,再提笔挥洒如下:
[a,b] = [b,a]
使用了 ES6 解构赋值的特性来实现
面试官:你这个使用了ES6的,有没有使用标准ES5的方法来实现
内心万马奔腾面带微笑os:这不是为难我胖虎吗?
(猝)
上面两种实现方法都是我们写代码中常用的,那么到底有没有其他方法可以实现上述的交换两个变量呢?答案肯定是有的,继续往下看之前,自己可先思考下能写出几种方式来。
其他方法
1. 利用算术运算
主要思路是先将一个变量变成一个和 a、b 都有关系的值,然后进行相加或者相减,进行交换。
var a = 10,
b = 20;
a = a + b; // a = 30 b = 20
b = a - b; // a = 30 b = 10
a = a - b; // a = 20 b = 10
这种方法挺容易理解的,主要是取其中一个变量存放 a、b 两个变量的和,当然,用差的形式也是可以的
var a = 10,
b = 20;
a = a - b; // a = -10 b = 20
b = a + b; // a = -10 b = 10
a = b - a; // a = 20 b = 10
这是利用存差的方式来交换,理解起来可能没有存放求和的过程来的直观,但是两者基本原理都是一样的。但该方法存在一个问题,如果数值太大的话可能会造成溢出。这个要注意。
2. 利用数组特性
思路大同小异,还是取一个变量存放 a、b 两个关系,我们用数组来存放
var a = 10,
b = 20;
a = [a, b]; // a = [10, 20] b = 20
b = a[0]; // a = [10, 20] b = 10
a = a[1]; // a = 20 b = 10
3. 利用对象特性
该方法和上面利用数组方法一样,只不过换成对象来存放
var a = 10,
b = 20;
a = {a: b, b: a}; // a = {a: 20, b: 10} b = 20
b = a.b; // a = {a: 20, b: 10} b = 10
a = a.a; // a = 20 b = 10
4. 异或方法
这个方法很多同学应该都不了解,利用的是位运算的技巧。关于位运算的可以简单看下我的上篇文章了解下
通过异或的方式,来进行变量的替换。
var a = 10, // a二进制为 1010
b = 11; // b二进制为 1011
a = a ^ b; // a = 0001 b = 1011
b = a ^ b; // a = 0001 b = 1010
a = a ^ b; // a = 1011 b = 1010
这个方法比较巧妙,先用变量 a 存放 a和b 异或的结果,再和 b 进行异或就能得出变量 a 的值。整体思路有点像算术运算的方法。大家可以消化下。
小结
虽然这是道很平常普通的题目,现实写代码中也不会要求实现这么多种。但主要目的还是通过这个小问题切入手,可以拓展出更多的知识点。有其他更加骚操作实现的同学可以在评论里展现下哦。