Joh*_*ica 344
JavaScript将其祖先追溯到C,而C没有逻辑XOR运算符.主要是因为它没用.Bitwise XOR非常有用,但在我多年的编程中,我从未需要逻辑XOR.
如果你有两个布尔变量,你可以模仿XOR:
if (a != b)
Run Code Online (Sandbox Code Playgroud)
使用两个任意变量可以!将它们强制转换为布尔值,然后使用相同的技巧:
if (!a != !b)
Run Code Online (Sandbox Code Playgroud)
这虽然很模糊,但肯定值得评论.实际上,你甚至可以在这一点上使用按位XOR运算符,尽管这对我来说太聪明了:
if (!a ^ !b)
Run Code Online (Sandbox Code Playgroud)
Pik*_*ass 77
Javascript有一个按位XOR运算符:^
var nb = 5^9 // = 12
Run Code Online (Sandbox Code Playgroud)
您可以将它与布尔值一起使用,它将结果显示为0或1(您可以将其转换回布尔值,例如result = !!(op1 ^ op2)).但正如约翰所说,它相当于result = (op1 != op2),更清楚.
Rob*_*ert 29
Javascript中没有真正的逻辑布尔运算符(尽管!非常接近).逻辑运算符只接受true或false作为操作数,并且只返回true或false.
在Javascript中&&并||采取各种操作数并返回各种有趣的结果(无论你喂它们什么).
逻辑运算符也应始终考虑两个操作数的值.
在Javascript中,&&并||采取懒惰的快捷方式,并在某些情况下不评估第二个操作数,从而忽略其副作用.使用逻辑xor无法重新创建此行为.
a() && b()a()如果它是假的,则评估并返回结果.否则,它会计算b()并返回结果.因此,如果两个结果都是真实的,那么返回的结果是真实的,否则就是假的.
a() || b()评估a()并返回结果,如果它是真的.否则,它会计算b()并返回结果.因此,如果两个结果都是假的,则返回的结果是假的,否则就是真实的.
所以一般的想法是首先评估左操作数.只有在必要时才会评估右操作数.最后一个值就是结果.这个结果可以是任何东西.对象,数字,字符串..无论如何!
这使得编写像这样的东西成为可能
image = image || new Image(); // default to a new Image
Run Code Online (Sandbox Code Playgroud)
要么
src = image && image.src; // only read out src if we have an image
Run Code Online (Sandbox Code Playgroud)
但是,此结果的真值也可用于确定"真实"逻辑运算符是返回true还是false.
这使得编写像这样的东西成为可能
if (typeof image.hasAttribute === 'function' && image.hasAttribute('src')) {
Run Code Online (Sandbox Code Playgroud)
要么
if (image.hasAttribute('alt') || image.hasAttribute('title')) {
Run Code Online (Sandbox Code Playgroud)
但是"逻辑"xor运算符(^^)总是必须评估两个操作数.这使得它与仅在必要时评估第二操作数的其他"逻辑"运算符不同.我认为这就是Javascript中没有"逻辑"xor的原因,以避免混淆.
那么如果两个操作数都是假的会发生什么呢?两者都可以归还.但只有一个可以返回.哪一个?第一个?还是第二个?我的直觉告诉我返回第一个但通常是"逻辑"的运算符从左到右评估并返回最后一个评估值.或者可能包含两个值的数组?
如果一个操作数是真实的而另一个操作数是假的,那么xor应该返回真正的操作数.或者也许是一个包含真实数组的数组,以使其与之前的情况兼容?
最后,如果两个操作数都是真的会发生什么?你会期待一些虚假的东西.但没有虚假的结果.所以操作不应该返回任何东西.也许undefined或者......一个空阵列?但是一个空阵列仍然是真实的.
采用阵列方法,你最终会遇到类似的情况if ((a ^^ b).length !== 1) {.很混乱.
Dom*_*omQ 12
两个布尔值的XOR只是它们是否不同,因此:
Boolean(a) !== Boolean(b)
Run Code Online (Sandbox Code Playgroud)
有......有点:
if( foo ? !bar : bar ) {
...
}
Run Code Online (Sandbox Code Playgroud)
或更容易阅读:
if( ( foo && !bar ) || ( !foo && bar ) ) {
...
}
Run Code Online (Sandbox Code Playgroud)
为什么?不知道.
因为javascript开发人员认为它是不必要的,因为它可以由其他已经实现的逻辑运算符表示.
你也可以和nand一起使用,这就是它,你可以从中得到其他可能的逻辑操作.
我个人认为它有历史原因,从基于c的语法语言驱动,我知道xor不存在或至少非常罕见.
小智 8
隐式转换为布尔值,然后执行xor,例如-
!!a ^ !!b
Run Code Online (Sandbox Code Playgroud)
是的,请执行以下操作.假设您正在处理布尔值A和B,则可以使用以下方法在JavaScript中计算A XOR B值
var xor1 = !(a === b);
Run Code Online (Sandbox Code Playgroud)
前一行也等同于以下内容
var xor2 = (!a !== !b);
Run Code Online (Sandbox Code Playgroud)
就个人而言,我更喜欢xor1,因为我必须键入较少的字符.我相信xor1也更快.它只是执行两次计算.xor2正在执行三次计算.
视觉解释...阅读下表(其中0代表假,1代表真),并比较第3和第5列.
!(A === B):
| A | B | A XOR B | A === B | !(A === B) |
------------------------------------------
| 0 | 0 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 1 | 0 |
------------------------------------------
Run Code Online (Sandbox Code Playgroud)
请享用.
小智 7
将值转换为布尔形式,然后进行按位XOR。它也将有助于非布尔值。
Boolean(a) ^ Boolean(b)
Run Code Online (Sandbox Code Playgroud)
查看:
您可以像这样模仿它:
if( ( foo && !bar ) || ( !foo && bar ) ) {
...
}
Run Code Online (Sandbox Code Playgroud)