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

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

JavaScript将其祖先追溯到C,而C没有逻辑异或运算符。 主要是因为没用。 按位异或是非常有用的,但是在我所有的编程年代中,我从来都不需要逻辑异或。

如果你有两个布尔variables你可以模仿XOR:

if (a != b) 

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

 if (!a != !b) 

这是相当晦涩的,但肯定值得评论。 事实上,你甚至可以在这个时候使用按位XOR运算符,虽然这对我的口味来说太聪明了:

 if (!a ^ !b) 

JavaScript有一个按位XOR运算符:^

 var nb = 5^9 // = 12 

你可以使用它与布尔值,它会给结果为0或1(你可以转换回布尔值,例如result = !!(op1 ^ op2) )。 但正如约翰所说,这相当于result = (op1 != op2) ,这更清楚。

Javascript中没有真正的逻辑运算符。 一个逻辑运算符只会将真或假作为参数,只会返回true或false。

在Javascript &&|| 采取各种论证,并返回各种结果。

a() && b()评估a()并返回结果如果是虚假的。 否则,它将评估b()并返回结果。 因此,如果两个结果都是真的,则返回的结果是真的,否则就是假的。

a() || b() a() || b()评估a()并返回结果如果是真的。 否则,它将评估b()并返回结果。 因此,如果两个结果都是错误的,则返回的结果是虚假的,否则就是真的。

所以总的想法是首先评估左边的论点。 只有在必要时才会评估正确的参数。 最后的结果被返回。 这个返回结果可以是任何东西。 对象,数字,string..不pipe!

这使得写这样的东西成为可能

 image = image || new Image(); // default to a new Image 

要么

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

但是这个结果的真值也可以用来决定一个“真实的”逻辑运算符是否会返回真或假。

这使得写这样的东西成为可能

 if ("hasAttribute" in image && image.hasAttribute("src")) { 

要么

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

但是一个“逻辑的”xor运算符( ^^ )总是要评估两个参数。 这使得它与仅在必要时评估第二个参数的其他“逻辑”运算符不同。 我认为这就是为什么Javascript中没有“逻辑”xor的原因。

无论如何,如果两个结果都是真的会发生什么? 你会期望一些虚伪的东西。 但是没有错误的结果。 所以操作不应该返回任何东西。

最后,如果两个结果都是错误的,会发生什么? 两者都可以退回。 但只有一个可以返回。 哪一个? 第一个? 还是第二个? 我的直觉告诉我返回第一个结果,但通常“逻辑”运算符从左到右评估并返回最后一个评估结果。

有…种:

 if( foo ? !bar : bar ) { ... } 

或更容易阅读:

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

为什么? 不知道。

因为JavaScript开发人员认为这是不必要的,因为它可以由其他已经实现的逻辑运算符来表示。

你也可以用nand来实现,那就可以从中得到其他可能的逻辑操作。

我个人认为,从基于c的语法语言驱动的历史原因,我的知识xor不存在或至less非常罕见。

查看:

  • JavaScript中的逻辑异或

你可以像这样模仿它:

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

两个布尔运算符的异或只是它们是不同的,因此:

 Boolean(a) !== Boolean(b) 

是的,只要做到以下几点。 假设您正在处理布尔值A和B,则可以使用以下JavaScript计算XOR B值

 var xor1 = !(a === b); 

上一行也相当于以下内容

 var xor2 = (!a !== !b); 

就个人而言,我更喜欢xor1,因为我必须input较less的字符。 我相信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 | ------------------------------------------ 

请享用。

如何将结果int转换为双重否定的布尔值 ? 不是很漂亮,但非常紧凑。

 var state1 = false, state2 = true; var A = state1 ^ state2; // will become 1 var B = !!(state1 ^ state2); // will become true console.log(A); console.log(B); 

在上面的xor函数中,会导致SIMILAR结果,因为逻辑异或并不完全是逻辑异或,意味着它将在数据types匹配的情况下导致“相等值为假”“不同值”为真

这个xor函数将作为实际的xor或者逻辑运算符来工作 ,意味着根据传递的值是true或者false会导致true或者false。 根据您的需要使用

 function xor(x,y){return true==(!!x!==!!y);} function xnor(x,y){return !xor(x,y);} 

没有逻辑XOR(^^)的原因是因为不像&&和|| 它没有给出任何懒惰的逻辑优势。 这是左右两个expression式的状态必须被评估。

试试这个简短的,容易理解的

 function xor(x,y){return true==(x!==y);} function xnor(x,y){return !xor(x,y);} 

这将适用于任何数据types