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