为什么JavaScript中没有逻辑异或?
当前回答
Cond1 xor cond2等价于Cond1 + cond2 == 1:
证明如下:
Let ops = [[false, false],[false, true], [true, false],[true, true]]; 函数xor(cond1, cond2){ 返回cond1 + cond2 == 1; } For (op of ops){ console.log(“$ {op [0]} xor $ {op [1]} $ {xor (op [0], op[1])}”) }
其他回答
Javascript有一个按位的异或运算符:^
var nb = 5^9 // = 12
你可以将它与布尔值一起使用,它会将结果作为0或1(你可以将其转换回布尔值,例如result = !!(op1 ^ op2)。但正如John所说,它等价于result = (op1 != op2),这更清楚。
为了子孙后代的利益,也因为我发现这是一个很好的练习,您可以很容易地利用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))
是的,按照下面的步骤做。 假设您正在处理布尔值A和B,那么可以使用以下代码在JavaScript中计算XOR B值
var xor1 = !(a === b);
上一行也相当于下面一行
var xor2 = (!a !== !b);
就我个人而言,我更喜欢xor1,因为我需要输入更少的字符。我相信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 |
------------------------------------------
享受。
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){。非常让人困惑。
Boolean的一行代码:
if (x ? !y : y) { do something cool }
推荐文章
- 拖放文件到标准HTML文件输入
- 如何清除所有<div>的内容在一个父<div>?
- 检测用户何时离开网页的最佳方法?
- 当“模糊”事件发生时,我如何才能找到哪个元素的焦点去了*到*?
- React不会加载本地图像
- 如何将Blob转换为JavaScript文件
- 在另一个js文件中调用JavaScript函数
- 如何在svg元素中使用z索引?
- 如何求一个数的长度?
- 跨源请求头(CORS)与PHP头
- 如何用Express/Node以编程方式发送404响应?
- parseInt(null, 24) === 23…等等,什么?
- JavaScript变量声明在循环外还是循环内?
- 元素在“for(…in…)”循环中排序
- 在哪里放置JavaScript在HTML文件?