为什么JavaScript中没有逻辑异或?
当前回答
在上面的异或函数中,它将产生类似的结果,因为逻辑异或不完全是逻辑异或,这意味着它将在考虑数据类型匹配的情况下产生“相等值为假”和“不同值为真”。
这个xor函数将作为实际的xor或逻辑运算符工作,这意味着它将根据传递的值是真还是假而得到真或假的结果。根据您的需要使用
function xor(x,y){return true==(!!x!==!!y);}
function xnor(x,y){return !xor(x,y);}
其他回答
将值转换为布尔形式,然后按位XOR:
Boolean(a) ^ Boolean(b) // === 0 | 1
注意,这个表达式的结果是一个数字,而不是一个布尔值。
位XOR也适用于非布尔值,但请记住,这是位操作符,而不是逻辑操作符。使用非bool可能不会像你预想的那样:
(5 ^ 3) === 6 // true
转换为布尔值,然后执行异或,比如-
!!a ^ !!b
JavaScript的祖先可以追溯到C语言,而C语言没有逻辑异或运算符。主要是因为它没什么用。位异或非常有用,但在我多年的编程生涯中,我从未需要过逻辑异或。
如果你有两个布尔变量,你可以用:
if (a != b)
你可以用两个任意变量!将它们强制转换为布尔值,然后使用相同的技巧:
if (!a != !b)
这是相当晦涩的,当然值得评论。实际上,你甚至可以在这里使用按位的XOR操作符,尽管这对我来说太聪明了:
if (!a ^ !b)
为了子孙后代的利益,也因为我发现这是一个很好的练习,您可以很容易地利用XOR操作符来强制使用真实性。就像被选中的答案一样,它可能有点太聪明了。
const xor = (a, b) => !!(!!a ^ !!b)
console.log(undefined ^ {}) // Returns 0, bitwise can't be done here.
console.log(xor(undefined, {})) // Returns true, because {} is truthy and undefined is falsy
console.log(0 ^ 1) // Works naturally, returns 1
console.log(xor(0, 1)) // Also works, returns true
console.log(true ^ false) // Again, returns true
console.log(xor(true, false)) // And again, returns true...
为了好玩,这应该在TypeScript中工作,通过强制显式的any:
const xor = (a: any, b: any) => !!((!!a as any) ^ (!!b as any))
嘿,我找到了这个解决方案,在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
}
推荐文章
- 窗口。亲近与自我。close不关闭Chrome中的窗口
- 同步和异步编程(在node.js中)的区别是什么?
- 在d3.js中调整窗口大小时调整svg的大小
- 如何将两个字符串相加,就好像它们是数字一样?
- 绑定多个事件到一个监听器(没有JQuery)?
- 在JavaScript中将JSON字符串解析为特定对象原型
- 将字符串“true”/“false”转换为布尔值
- 如何使用JavaScript代码获得浏览器宽度?
- event.preventDefault()函数在IE中无法工作
- indexOf()和search()的区别是什么?
- 错误:'types'只能在.ts文件中使用- Visual Studio Code使用@ts-check
- React-Native:应用程序未注册错误
- LoDash:从对象属性数组中获取值数组
- src和dist文件夹的作用是什么?
- jQuery UI对话框-缺少关闭图标