为什么JavaScript中没有逻辑异或?
当前回答
将值转换为布尔形式,然后按位XOR:
Boolean(a) ^ Boolean(b) // === 0 | 1
注意,这个表达式的结果是一个数字,而不是一个布尔值。
位XOR也适用于非布尔值,但请记住,这是位操作符,而不是逻辑操作符。使用非bool可能不会像你预想的那样:
(5 ^ 3) === 6 // true
其他回答
查看:
JavaScript中的逻辑异或
你可以这样模仿它:
if( ( foo && !bar ) || ( !foo && bar ) ) {
...
}
有……类:
if( foo ? !bar : bar ) {
...
}
或者更容易读:
if( ( foo && !bar ) || ( !foo && bar ) ) {
...
}
为什么?不晓得。
因为javascript开发人员认为这是不必要的,因为它可以用其他已经实现的逻辑运算符来表示。
你也可以只用nand,就是这样,你可以从它得到所有其他可能的逻辑运算。
我个人认为它有历史原因,从基于c的语法语言驱动,据我所知,xor不存在或至少非常罕见。
是的,按照下面的步骤做。 假设您正在处理布尔值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 }
推荐文章
- 给一个数字加上st, nd, rd和th(序数)后缀
- 如何以编程方式触发引导模式?
- setTimeout带引号和不带括号的区别
- 在JS的Chrome CPU配置文件中,'self'和'total'之间的差异
- 用javascript检查输入字符串中是否包含数字
- 如何使用JavaScript分割逗号分隔字符串?
- 在Javascript中~~(“双波浪号”)做什么?
- 谷歌chrome扩展::console.log()从后台页面?
- 未捕获的SyntaxError:
- [].slice的解释。调用javascript?
- jQuery日期/时间选择器
- 我如何预填充一个jQuery Datepicker文本框与今天的日期?
- 数组的indexOf函数和findIndex函数的区别
- jQuery添加必要的输入字段
- Access-Control-Allow-Origin不允许Origin < Origin >