为什么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