为什么JavaScript中没有逻辑异或?
当前回答
在Typescript中(+变为数值):
value : number = (+false ^ +true)
So:
value : boolean = (+false ^ +true) == 1
其他回答
是的,按照下面的步骤做。 假设您正在处理布尔值A和B,那么可以使用以下代码在JavaScript中计算XOR B值
var xor1 = !(a === b);
上一行也相当于下面一行
var xor2 = (!a !== !b);
就我个人而言,我更喜欢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 |
------------------------------------------
享受。
两个布尔值的异或仅仅是它们是否不同,因此:
Boolean(a) !== Boolean(b)
查看:
JavaScript中的逻辑异或
你可以这样模仿它:
if( ( foo && !bar ) || ( !foo && bar ) ) {
...
}
这里有一个替代解决方案,与2+变量的工作,并提供计数作为奖金。
这里有一个更通用的解决方案来模拟任何真/假值的逻辑XOR,就像你在标准if语句中有运算符一样:
Const v1 = true; Const v2 = -1;// true(警告,一如既往) Const v3 = "";/ / falsy Const v4 = 783;/ /真相 Const v5 = false; 如果(!!)V1 + !!V2 + !!V3 + !!V4 + !!V5) === 1) 文档。写(“[$ {v1} XOR $ {v2} XOR " $ {v3} " XOR $ {v4} XOR $ {v5}]是真的!”); 其他的 文档。写(“[$ {v1} XOR $ {v2} XOR " $ {v3} " XOR $ {v4} XOR $ {v5}]是假的!”);
我喜欢这个的原因是,它还回答了“这些变量中有多少是真实的?”,所以我通常会预先存储这个结果。
对于那些想要严格的布尔- true异或检查行为的人,只需执行:
if( ( ( v1===true ) + ( v2===true ) + ( v3===true ) + ( v4===true ) + ( v5===true ) ) === 1 )
// etc.
如果你不关心计数,或者如果你关心最优性能:那么只需对强制为布尔值的值按位使用xor,用于真/假解决方案:
if( !!v1 ^ !!v2 ^ !!v3 ^ !!v4 ^ !!v5 )
// etc.
有……类:
if( foo ? !bar : bar ) {
...
}
或者更容易读:
if( ( foo && !bar ) || ( !foo && bar ) ) {
...
}
为什么?不晓得。
因为javascript开发人员认为这是不必要的,因为它可以用其他已经实现的逻辑运算符来表示。
你也可以只用nand,就是这样,你可以从它得到所有其他可能的逻辑运算。
我个人认为它有历史原因,从基于c的语法语言驱动,据我所知,xor不存在或至少非常罕见。