在JavaScript中执行xnor操作

12

我有两个字符串存储在ab中。如果这两个字符串都有值,我想进行一些验证。为此,我使用以下代码:

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

然而,如果其中一个为空,而另一个不为空,则需要单独处理。如果两者都为空,则无需采取任何行动。因此,为了处理这种情况,它是XNOR的false情况。

我可以这样做:

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

还有比这更好的方法吗?


你想知道哪一个是空的,哪一个不是吗?还是你只想知道其中一个是空的? - ibrahim mahrir
1
不过,你可以省略括号,因为 && 的运算优先级高于 ||if (a && !b || !a && b) { - Nina Scholz
2
如果你把第二个if作为第一个else,就可以简化它:if (a && b) { ... } else if (a || b) { ... } - Cᴏʀʏ
另一种写法是 if(!a != !b) - Jonas Wilms
2个回答

6

让我们将你的两个单独的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)

您可以看到当a为真或b为真时,正面结果(x=1)就会出现,这简化为a || b。您的if语句的最终版本应如下所示:

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

6

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

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

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

然而,所有这些方法的缺点是有可能多次评估a和b。如果a或b是函数或表达式,则可能会出现问题。更好的方法是通过重新定义异或操作来解决:当两个布尔操作数的值不相同时返回true。我们可以这样实现:
//XOR
if( a != b ) {
  ...
}

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

现在这段代码更加简短,更重要的是,只对ab进行一次求值。然而,这仅适用于ab都是布尔值的情况。如果您想支持其他类型,您需要先将它们转换为布尔值:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接