为什么JavaScript中没有逻辑异或?


当前回答

将值转换为布尔形式,然后按位XOR:

Boolean(a) ^ Boolean(b) // === 0 | 1

注意,这个表达式的结果是一个数字,而不是一个布尔值。

位XOR也适用于非布尔值,但请记住,这是位操作符,而不是逻辑操作符。使用非bool可能不会像你预想的那样:

(5 ^ 3) === 6 // true

其他回答

Javascript有一个按位的异或运算符:^

var nb = 5^9 // = 12

你可以将它与布尔值一起使用,它会将结果作为0或1(你可以将其转换回布尔值,例如result = !!(op1 ^ op2)。但正如John所说,它等价于result = (op1 != op2),这更清楚。

转换为布尔值,然后执行异或,比如-

!!a ^ !!b

JavaScript的祖先可以追溯到C语言,而C语言没有逻辑异或运算符。主要是因为它没什么用。位异或非常有用,但在我多年的编程生涯中,我从未需要过逻辑异或。

如果你有两个布尔变量,你可以用:

if (a != b)

你可以用两个任意变量!将它们强制转换为布尔值,然后使用相同的技巧:

if (!a != !b)

这是相当晦涩的,当然值得评论。实际上,你甚至可以在这里使用按位的XOR操作符,尽管这对我来说太聪明了:

if (!a ^ !b)

没有逻辑异或(^^)的原因是,与&&和||不同,它没有提供任何惰性逻辑优势。也就是左右两边表达式的状态都要求值。

查看:

JavaScript中的逻辑异或

你可以这样模仿它:

if( ( foo && !bar ) || ( !foo && bar ) ) {
  ...
}