为什么JavaScript中没有逻辑异或?
当前回答
转换为布尔值,然后执行异或,比如-
!!a ^ !!b
其他回答
没有逻辑异或(^^)的原因是,与&&和||不同,它没有提供任何惰性逻辑优势。也就是左右两边表达式的状态都要求值。
Javascript有一个按位的异或运算符:^
var nb = 5^9 // = 12
你可以将它与布尔值一起使用,它会将结果作为0或1(你可以将其转换回布尔值,例如result = !!(op1 ^ op2)。但正如John所说,它等价于result = (op1 != op2),这更清楚。
试试这个简短易懂的
function xor(x,y){return true==(x!==y);}
function xnor(x,y){return !xor(x,y);}
这适用于任何数据类型
这里有一个替代解决方案,与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.
两个布尔值的异或仅仅是它们是否不同,因此:
Boolean(a) !== Boolean(b)
推荐文章
- 拖放文件到标准HTML文件输入
- 如何清除所有<div>的内容在一个父<div>?
- 检测用户何时离开网页的最佳方法?
- 当“模糊”事件发生时,我如何才能找到哪个元素的焦点去了*到*?
- React不会加载本地图像
- 如何将Blob转换为JavaScript文件
- 在另一个js文件中调用JavaScript函数
- 如何在svg元素中使用z索引?
- 如何求一个数的长度?
- 跨源请求头(CORS)与PHP头
- 如何用Express/Node以编程方式发送404响应?
- parseInt(null, 24) === 23…等等,什么?
- JavaScript变量声明在循环外还是循环内?
- 元素在“for(…in…)”循环中排序
- 在哪里放置JavaScript在HTML文件?