前端开发当中鲜有涉及到位运算,因此,对其的应用也基本停留在语法层面。但最近遇到的一个需求,却令自己对位运算刮目相看。
产品要求在进行输入验证时,当且仅当全部有值或者全部为空时合法。此时,若用传统的if进行判断,将会有不少的分支,对于代码的测试和维护均是一个挑战。对于此情景,不禁联想到“异或”的特点,天然与此需求吻合。
于是,改变实现如下:
javascriptCopy code- 1
- 2
- 3
if (!name ^ !phone ^ !address) {
...
}
if (!name ^ !phone ^ !address) {
...
}
但结果在输入两项有值时失效,究其原因,列表如下:
输入 | 期望输出 | 实际输出 | ||
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 0 | 1 |
稍加分析,便可知当中的逻辑:两两相异或,结果便是期望的三者间的异或。而对于以上例子,结果只能保证有且只有一个有值或者全部有值。
因此,修复后的代码如下:
javascriptCopy code- 1
- 2
- 3
if (!name ^ !phone || !name ^ !address) {
...
}
if (!name ^ !phone || !name ^ !address) {
...
}
至此,两个异或+一个或即完美实现需求。