在我们学习编程之初, 就学习过变量的赋值操作, 同时也学习了将一个变量的值赋值给另外一个变量. 对于交换两个变量的值, 很多童鞋都有解决方案. 然鹅, 对于面试官提出的不借助第三变量来交换两个变量的值, 你能想到几种解决方案呢?
如果你只知道一种方案, 请你认真看下去...
如果你知道两种方案, 那么你可以来了解更多方案了...
一, 最简单的实现 - 最初的记忆
让我们由浅入深, 来了解交换变量值的最简单, 最初的解决方案: 借助于第三个变量
- // 声明变量 a 和 b
- let a = 5
- let b = 4
- // 1. 临时将变量 a 的值赋值给变量 tmp
- let tmp = a
- // 2. 将变量 b 的值赋值给 a
- a = b
- // 3. 将变量 a 的值 (tmp 的值) 赋值给 b
- b = tmp
- console.log(a) // 4
- console.log(b) // 5
- so east!
二, 不借助第三变量的实现 - ES6 版
面试官在听到上面给出的解决方案后, 微微一笑 (脑海中闪现到: 你以为就这么简单) 说道, 有其他解决方案吗, 不借助第三变量呢?
了解学习了 JS ES6 的数组解构赋值的童鞋对此冷冷一笑, 嘴角一撇, 冷酷酷地说道: 也可以使用 ES6 的数组解构赋值来交换变量的值.
- let a = 5;
- let b = 4; // 请注意此位置的分号; 是一定要存在的呀
- // 数组结构赋值, 交换变量 a,b 的值
- [a, b] = [b, a]
- console.log(a) // 4
- console.log(b) // 5
看到面试官的脸色似乎渐渐露出了满意的神色, 内心是不是有点儿窃喜.
如果此刻面试官又说道, 还有没有其他的解决方案, 小朋友, 你是不是有许多问号?
三, 不借助第三变量的实现 - 终极版本一: 单纯数学运算
胡哥在这里再次强调, 这绝对不是一个考验 "智商" 的答案, 只是考验了在编程的变通能力以及经验问题, 下面请看代码的实现.
- let a = 5
- let b = 4
- // 接下来就是见证神奇的时刻, 来, 镜头请对准我.
- // 二者之和
- a = a + b
- // 二者之和 - b 的值, 剩余 a 的值赋值给变量 b
- b = a - b
- // 此刻 a 还是二者之和, a - b 此刻相当于二者之和 - 变量 b(a 的值), 那么此刻剩余的就是变量 b 的值, 赋值给 a 变量
- a = a - b
- // yes, we did!
- console.log(a) // 4
- console.log(b) // 5
如果此刻面试官再问出还有没有其他的方案, 此刻你会慌的一比呢, 还是内心大喊 "wc" 呢
四, 不借助第三变量的实现 - 终极版本二: 位运算符 ^
不要怕, 兄弟们, 接下来给大家来分享第四种方式, 位运算符 ^ 异或. 在变量的运算中这个操作符有什么作用呢?
异或运算符:
是执行位运算的, 二进制运算, 参与变量运算的两个变量要转为二进制进行运算.
如果相同二进制位的值相同, 则转为 0, 否则转为 1.
那交换两个变量的值具体代码是如何实现的呢? 请看大屏幕, 哦, 不, 请往下看.
- let a = 5 // 0101
- let b = 4 // 0100
- // 按位异或运算
- a = a ^ b // 0101 ^ 0100 ===> 0001, 此时 a 的值为 1
- b = a ^ b // 0001 ^ 0100 ===> 0101, 此时 b 的值为 5
- a = a ^ b // 0001 ^ 0101 ===> 0100, 此时 a 的值为 4
- console.log(a) // 4
- console.log(b) // 5
惊不惊喜, 意不意外...
以上四种实现交换两个变量值得方案你都掌握了吗, 如果掌握了, 可以对面试官反手就是一个 "吊打" 了.
如果你有更多的解决交换两个变量值的方案, 欢迎留言交流呀!
后记
来源: https://www.cnblogs.com/justbecoder/p/12702624.html