为什么JavaScript中没有逻辑异或?
当前回答
如何将结果int转换为带有双重否定的bool ?不是很漂亮,但是很紧凑。
Var state1 = false, State2 = true; var A = state1 ^ state2;//将变成1 var B = !!(state1 ^ state2);//将变为true console.log(一个); console.log (B);
其他回答
查看:
JavaScript中的逻辑异或
你可以这样模仿它:
if( ( foo && !bar ) || ( !foo && bar ) ) {
...
}
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){。非常让人困惑。
Javascript有一个按位的异或运算符:^
var nb = 5^9 // = 12
你可以将它与布尔值一起使用,它会将结果作为0或1(你可以将其转换回布尔值,例如result = !!(op1 ^ op2)。但正如John所说,它等价于result = (op1 != op2),这更清楚。
转换为布尔值,然后执行异或,比如-
!!a ^ !!b
嘿,我找到了这个解决方案,在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
}
推荐文章
- 给一个数字加上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 >