问题 在javascript中执行xnor


我存储了两个字符串 a & b。如果两个字符串都有一些值,我想要进行一些验证。为此,我使用:

if(a && b) {
    //Do some processing.
}

但是,如果其中一个是空的而另一个不是,那么我需要单独处理它。如果两者都是空的,我不需要做任何事情。所以基本上处理这种情况是XNOR的错误情况。 我可以这样做:

if((a && !b) || (!a && b)) {
    //handle separately. 
}

有比这更好的方法吗?


10163
2017-12-19 18:55


起源

你想知道哪个oe是空的,哪个不是?或者你只是想知道一个是空的? - ibrahim mahrir
不,但你可以省略括号,因为运算符优先 && 过度 ||: if (a && !b || !a && b) { - Nina Scholz
如果你做第二个 if 一个 else 第一个,你可以简化它: if (a && b) { ... } else if (a || b) { ... }。 - Cᴏʀʏ
另外 if(!a != !b) - Jonas Wilms


答案:


让我们将两个单独的if语句合并为一个(实际上相同,但有助于简化):

if (a && b)
    // do some processing
else if (a && !b || !a && b)
    // do other processing

为了弄清楚我们是否可以进一步简化,让我们看一下第二个条件的真值表:

a  |  b  |  x
--------------
1  |  0  |  1  (a && !b)
0  |  1  |  1  (!a && b)
0  |  0  |  0  (a && b) (negating the first if)

你可以看到积极的结果(x = 1)存在时 a 是真的还是什么时候 b 是真的,这简化为 a || b。 if语句的最终版本如下所示:

if (a && b)
    // do some processing
else if (a || b)
    // do other processing

6
2017-12-19 19:05





JavaScript没有XOR和XNOR运算符。有很多方法可以实现它们,实现它的方式很好。另一种方法是使用三元运算符:

//XOR
if( a ? !b : b ) {
  ...
}

//XNOR
if( a ? b : !b ) {
  ...
}

但是,所有这些方法都有潜在评估的缺点 a 和 b 不止一次。如果这可能是一个问题 a 要么 b 是一个函数或表达式。更好的方法是将XOR的定义重写为: 如果两个布尔操作数不具有相同的值,则返回true。我们可以像这样实现:

//XOR
if( a != b ) {
  ...
}

//XNOR
if( a == b ) {
  ...
}

现在,这要短得多,更重要的是,只进行评估 a 和 b 一旦。但是,这只适用于两者 a 和 b 是布尔人。如果你想支持其他类型,你必须先将它们转换为布尔值:

//XOR
if( !a != !b ) {
  ...
}

//XNOR
if( !a == !b ) {
  ...
}

5
2017-12-19 19:14