由于布尔值true
和在对它们使用按位运算符时分别false
转换为1
和0
,因此按位异或^
可以作为逻辑异或和按位执行双重任务,只要您的值是布尔值(Javascript的“真实”值不会工作)。使用否定!
运算符很容易实现这一点。
a XOR b
在逻辑上等价于以下(短)表达式列表:
!a ^ !b;
!a != !b;
还有很多其他可能的形式 - 例如!a ? !!b : !b
- 但是这两种模式的优点是只评估a
and一次(如果是 false 并且因此不会评估,b
也不会“短路” ),而使用 ternary , OR ,或 AND运算符将进行双重评估或短路。a
b
?:
||
&&
两个语句中的否定!
运算符很重要,包括以下几个原因:它将所有“真实”值转换为布尔值(“”-> false、12-> true 等),以便按位运算符具有可以工作的值with,所以不等式!=
运算符只比较每个表达式的真值(a != b
如果a
或b
不相等,非空字符串等将无法正常工作),因此每个评估返回一个布尔值结果而不是第一个“真”价值。
您可以通过添加双重否定(或例外,!!a ^ !!b
仍然等价于 XOR)来继续扩展这些形式,但在否定表达式的一部分时要小心。如果您考虑算术分布( where 等),这些形式乍一看似乎“有效” 2(a + b) == 2a + 2b
,但实际上从 XOR 产生不同的真值表(这些产生与逻辑 NXOR 相似的结果):
!( a ^ b )
!( !!a ^ !!b )
!!a == !!b
那么,异或的一般形式可以是函数(真值表小提琴):
function xor( a, b ) { return !a ^ !b; }
然后您的具体示例将是:
if ( xor( isEmptyString( firstStr ), isEmptyString( secondStr ) ) ) { ... }
或者,如果isEmptyString
只返回布尔值并且您不需要通用xor
函数,只需:
if ( isEmptyString( firstStr ) ^ isEmptyString( secondStr ) ) { ... }