无论如何在javascript中实现XOR

amo*_*ran 41 javascript validation xor

我试图通过以下方式在javascript中实现XOR:

   // XOR validation
   if ((isEmptyString(firstStr) && !isEmptyString(secondStr)) ||
    (!isEmptyString(firstStr) && isEmptyString(secondStr))
   {
    alert(SOME_VALIDATION_MSG);
    return;
   }
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法在JavaScript中执行此操作?

谢谢.

swe*_*rup 55

正如其他人所指出的那样,逻辑XOR对于布尔值来说是不相等的,所以你可以这样做:


  // XOR validation
  if( isEmptyString(firstStr) != isEmptyString(secondStr) )
    {
      alert(SOME_VALIDATION_MSG);
      return;
    }
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.*所以*对读者来说要比使用否定和按位xor更加清晰. (2认同)

Ein*_*eki 34

我假装你正在寻找一个逻辑XOR,因为javascript已经有一个按位(^):)

我通常使用一个简单的三元运算符(我很少使用其中一个):

if ((isEmptyString(firstStr) ? !isEmptyString(secondStr) 
                             : isEmptyString(secondStr))) {
alert(SOME_VALIDATION_MSG);
    return;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

致力于@Jeff Meatball Yang 解决方案

if ((!isEmptyString(firstStr) ^ !isEmptyString(secondStr))) {
  alert(SOME_VALIDATION_MSG);
  return;
}
Run Code Online (Sandbox Code Playgroud)

你否定了值以便在布尔值中转换它们然后应用按位xor运算符.也许它不像第一个解决方案那么可维护(或者我可能已经习惯了第一个解决方案)

  • "最干净,最好"(引自http://jonathonhill.net/2009-02-12/logical-xor-in-javascript/):`((test1)!=(test2))` (9认同)
  • `!x ^!y`实际上是x和y的XNOR.`!(!x ^!y)`将是XOR. (4认同)
  • @Trey所述`的x ^ y`在应答使用为XOR正确制剂! - !(!的x ^ y)的NXOR将是合乎逻辑等价,XOR的否定,因此``.这[小提琴](http://jsfiddle.net/mt4uW/)显示了两种`χ^ y`和`(X ^ Y!!)`真值表 - !!!前者符合的异或与后者NXOR.@Jamie`!!的x ^ !! y`可以代替在XOR(`!的x ^!y`),但不适用于`!(!的x ^!Y)` (3认同)

Jef*_*ang 11

你正在做一个布尔值的XOR,很容易建模成一个按位XOR(Javascript有):

var a = isEmptyString(firstStr) ? 1 : 0;
var b = isEmptyString(secondStr) ? 1 : 0;

if(a ^ b) { ... }
Run Code Online (Sandbox Code Playgroud)

http://www.howtocreate.co.uk/xor.html

  • 思考你的答案......为什么不呢!isEmptyString(firstStr)^!isEmptyString(secondStr) (3认同)
  • +1 ......这就是我一直被教导做XOR的方法. (2认同)

CMS*_*CMS 8

您可以^直接使用按位XOR运算符():

if (isEmptyString(firstStr) ^ isEmptyString(secondStr)) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

它将适用于您的示例,因为布尔值truefalse值被转换为1并且0因为按位运算符使用32位整数.

该表达式也将返回01,并且该值将被if语句强制回布尔值.

您应该知道上述方法发生的类型强制,如果您正在寻找良好的性能,我不建议您使用按位运算符,您也可以使用仅逻辑逻辑来创建一个简单的函数运营商:

function xor(x, y) {
  return (x || y) && !(x && y);
}


if (xor(isEmptyString(firstStr), isEmptyString(secondStr))) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*ico 7

一种方法更简单:

if ((x+y) % 2) {
    //statement
}
Run Code Online (Sandbox Code Playgroud)

当然假设两个变量都是真正的布尔值,即1或者0.

  • 如果x === y你得到一个偶数,那么XOR就是0.
  • 如果x !== y那时你会得到一个奇数,所以XOR将是1:)

第二种选择,如果您注意到x != y评估为XOR,那么您必须做的就是

if (x != y) {
    //statement
}
Run Code Online (Sandbox Code Playgroud)

这将再次评估为异或.(我更喜欢这个)

当然,一个好主意是将它实现为一个函数,但它只是你的选择.

希望这两种方法中的任何一种都能帮到别 我将此答案标记为社区维基,因此可以进行改进.


fro*_*die 5

在javascript中查看XOR的不同实现的这种解释.

只是在这里总结一些:

if( ( isEmptyString(firstStr) || isEmptyString(secondStr)) && !( isEmptyString(firstStr) && isEmptyString(secondStr)) ) {
   alert(SOME_VALIDATION_MSG); 
   return; 
}
Run Code Online (Sandbox Code Playgroud)

要么

if( isEmptyString(firstStr)? !isEmptyString(secondStr): isEmptyString(secondStr)) {
   alert(SOME_VALIDATION_MSG); 
   return;
}
Run Code Online (Sandbox Code Playgroud)

要么

if( (isEmptyString(firstStr) ? 1 : 0 ) ^ (isEmptyString(secondStr) ? 1 : 0 ) ) {
   alert(SOME_VALIDATION_MSG); 
   return;
}
Run Code Online (Sandbox Code Playgroud)

要么

if( !isEmptyString(firstStr)!= !isEmptyString(secondStr)) {
   alert(SOME_VALIDATION_MSG); 
   return;
}
Run Code Online (Sandbox Code Playgroud)

  • @foadie:因为Stack Overflow是*答案*,而不是*答案的链接*.如果您的链接明天破裂,您的答案将失去所有**值. (2认同)

Rob*_*loi 5

从引用文章:

不幸的是,JavaScript没有逻辑XOR运算符.

您可以通过以下方式"模拟"XOR运算符的行为:

if( !foo != !bar ) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

链接的文章讨论了几种替代方法.

  • 你能否在这里提供答案,而不是让用户离开网站以获得他们想要的东西? (3认同)
  • 复制和粘贴?不,你为什么不在这里解释相同(或类似)的解决方案,以帮助那些遇到这个问题的人.如果您的链接明天破裂,您的答案将毫无用处. (3认同)