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


当前回答

如何将结果int转换为带有双重否定的bool ?不是很漂亮,但是很紧凑。

Var state1 = false, State2 = true; var A = state1 ^ state2;//将变成1 var B = !!(state1 ^ state2);//将变为true console.log(一个); console.log (B);

其他回答

在Typescript中(+变为数值):

value : number = (+false ^ +true)

So:

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

Boolean的一行代码:

if (x ? !y : y) { do something cool }

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

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

!!a ^ !!b

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

or

src = image && image.src; // only read out src if we have an image

但是这个结果的真值也可以用来判断一个“实”逻辑运算符返回的是真还是假。

这使得我们可以写出

if (typeof image.hasAttribute === 'function' && image.hasAttribute('src')) {

or

if (image.hasAttribute('alt') || image.hasAttribute('title')) {

但是“逻辑”异或操作符(^^)总是必须对两个操作数求值。这使得它不同于其他“逻辑”操作符,后者只在必要时计算第二个操作数。我认为这就是Javascript中没有“逻辑”xor的原因,以避免混淆。


如果两个操作数都是假的,会发生什么?两者都可以归还。但只能退回一件。哪一个?第一个?还是第二个?我的直觉告诉我返回第一个,但通常“逻辑”操作符从左到右求值,并返回最后一个求值的值。或者一个包含这两个值的数组?

如果一个操作数为真,另一个操作数为假,xor应该返回真值。或者可能是一个包含真值的数组,以使它与前一种情况兼容?

最后,如果两个操作数都为真,会发生什么?你会期待一些虚假的东西。但没有虚假的结果。所以这个操作不应该返回任何东西。所以可能没有定义或者。空数组?但空数组仍然为真。

采用数组的方法,你会得到这样的条件:if ((a ^^ b).length !== 1){。非常让人困惑。