前端开发当中鲜有涉及到位运算,因此,对其的应用也基本停留在语法层面。但最近遇到的一个需求,却令自己对位运算刮目相看。

产品要求在进行输入验证时,当且仅当全部有值或者全部为空时合法。此时,若用传统的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) { ... }

至此,两个异或+一个或即完美实现需求。