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


当前回答

Cond1 xor cond2等价于Cond1 + cond2 == 1:

证明如下:

Let ops = [[false, false],[false, true], [true, false],[true, true]]; 函数xor(cond1, cond2){ 返回cond1 + cond2 == 1; } For (op of ops){ console.log(“$ {op [0]} xor $ {op [1]} $ {xor (op [0], op[1])}”) }

其他回答

嘿,我找到了这个解决方案,在JavaScript和TypeScript上制作和XOR。

if( +!!a ^ +!!b )
{
  //This happens only when a is true and b is false or a is false and b is true.
}
else
{
  //This happens only when a is true and b is true or a is false and b is false
}

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

var nb = 5^9 // = 12

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

这里有一个替代解决方案,与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.

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

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

if (a != b)

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

if (!a != !b)

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

if (!a ^ !b)

在Typescript中(+变为数值):

value : number = (+false ^ +true)

So:

value : boolean = (+false ^ +true) == 1