验证-是否有办法在javascript中实现XOR

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

   // XOR validation
   if ((isEmptyString(firstStr) && !isEmptyString(secondStr)) ||
    (!isEmptyString(firstStr) && isEmptyString(secondStr))
   {
    alert(SOME_VALIDATION_MSG);
    return;
   }

有没有更好的办法在javascript中做到这一点?

谢谢。

amoran asked 2020-08-11T23:14:22Z
18个解决方案
55 votes

正如其他人指出的,逻辑异或与布尔值不等于相同,因此您可以执行以下操作:


  // XOR validation
  if( isEmptyString(firstStr) != isEmptyString(secondStr) )
    {
      alert(SOME_VALIDATION_MSG);
      return;
    }
swestrup answered 2020-08-11T23:15:06Z
34 votes

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

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

if ((isEmptyString(firstStr) ? !isEmptyString(secondStr) 
                             : isEmptyString(secondStr))) {
alert(SOME_VALIDATION_MSG);
    return;
}

编辑:

在@Jeff Meatball Yang解决方案上工作

if ((!isEmptyString(firstStr) ^ !isEmptyString(secondStr))) {
  alert(SOME_VALIDATION_MSG);
  return;
}

您可以取反这些值,以便将其转换为布尔值,然后应用按位xor运算符。 也许它不如第一个解决方案可维护(或者我对第一个解决方案太习惯了)

Eineki answered 2020-08-11T23:14:46Z
11 votes

您正在对布尔值进行XOR,可轻松将其建模为按位XOR(Javascript具有):

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

if(a ^ b) { ... }

[HTTP://呜呜呜.how to create.co.UK/xor.HTML]

Jeff Meatball Yang answered 2020-08-11T23:15:30Z
8 votes

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

if (isEmptyString(firstStr) ^ isEmptyString(secondStr)) {
  // ...
}

由于将布尔值3007316742755585582976和1值转换为if0,因为按位运算符使用32位整数,所以它将对您的示例有用。

该表达式还将返回01,并且该值将由if语句强制返回布尔值。

您应该意识到上述方法会产生类型强制,如果您要寻找良好的性能,我不建议您使用按位运算符,也可以使用布尔逻辑来做一个简单的函数来实现 运营商:

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


if (xor(isEmptyString(firstStr), isEmptyString(secondStr))) {
  // ...
}
CMS answered 2020-08-11T23:16:05Z
7 votes

一种更简单的方法:

if ((x+y) % 2) {
    //statement
}

当然假设两个变量均为真布尔值,即x != y1

  • 如果x != y您将得到一个偶数,那么XOR为1
  • 如果x != y,那么您将得到一个奇数,因此XOR为1 :)

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

if (x != y) {
    //statement
}

它将再次评估为XOR。 (我更喜欢这个)

当然,一个不错的主意是将其实现为一个函数,但这仅是您的选择。

希望两种方法中的任何一种都能帮助到别人! 我将此答案标记为社区Wiki,因此可以对其进行改进。

Nico answered 2020-08-11T23:16:56Z
5 votes

查看有关javascript中XOR的不同实现的说明。

仅在这里总结其中的一些:

if( ( isEmptyString(firstStr) || isEmptyString(secondStr)) && !( isEmptyString(firstStr) && isEmptyString(secondStr)) ) {
   alert(SOME_VALIDATION_MSG); 
   return; 
}

要么

if( isEmptyString(firstStr)? !isEmptyString(secondStr): isEmptyString(secondStr)) {
   alert(SOME_VALIDATION_MSG); 
   return;
}

OR

if( (isEmptyString(firstStr) ? 1 : 0 ) ^ (isEmptyString(secondStr) ? 1 : 0 ) ) {
   alert(SOME_VALIDATION_MSG); 
   return;
}

OR

if( !isEmptyString(firstStr)!= !isEmptyString(secondStr)) {
   alert(SOME_VALIDATION_MSG); 
   return;
}
froadie answered 2020-08-11T23:19:25Z
5 votes

引用本文内容:

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

您可以使用以下方式“模拟” XOR运算符的行为:

if( !foo != !bar ) {
  ...
}

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

Roberto Aloi answered 2020-08-11T23:19:58Z
2 votes

XOR的意思是“这两个布尔值是否不同?”。 因此:

if (!!isEmptyString(firstStr) != !!isEmptyString(secondStr)) {
    // ...
}

!!s只是为了确保!=运算符比较两个真实的布尔值,因为可以想象isEmptyString()返回其他内容(例如300732122406741709709返回false,或者字符串本身返回true)。

Sean answered 2020-08-11T23:20:22Z
2 votes

假设您正在寻找BOOLEAN XOR,这是一个简单的实现。

function xor(expr1, expr2){
    return ((expr1 || expr2) && !(expr1 && expr2));
}

上面的内容源自“排他性析取”的定义(一个,但不是两个)。

Butshuti Hakiza answered 2020-08-11T23:20:47Z
2 votes

由于将布尔值a XOR bfalse分别转换为10时,按位XOR ^既可以用作逻辑XOR,也可以按位进行双重运算,只要您的值是布尔值( JavaScript的“真实”值无法正常工作)。 使用否定符!可以轻松实现。

a XOR b从逻辑上等效于以下(简短的)表达式列表:

!a ^ !b;
!a != !b;

还有许多其他可能的形式,例如!-但是这两种模式的优势是仅对3007322051335160160和a != b分别进行一次评估(如果a为假,因此也不会“短路”,因此不评估b) 使用三元数3007322051331335160837,或||或AND 3007322051335160160839,运算符将进行两次评估或短路。

两个语句中的否定!运算符之所以很重要,原因有两个:将所有“真实”值转换为布尔值(“”-> false,12-> true等),以便按位运算符具有可以 因此,不等式3007322051331335160833运算符仅比较每个表达式的真值(如果a或3007322051335160160是非等于,非空字符串等,则a != b将无法正常工作),因此每个评估返回的都是布尔值结果,而不是布尔值结果 第一个“真实”值。

您可以通过添加双重否定来继续扩展这些形式(或者例外,isEmptyString,它仍然等效于XOR),但是在否定表达式的一部分时要小心。 如果您考虑算术的分布(其中300732205135191938049等),这些形式乍一看似乎对“工作”有效,但实际上它们产生的异或表与XOR不同(它们产生的结果与逻辑NXOR相似):

!( a ^ b )
!( !!a ^ !!b )
!!a == !!b

因此,XOR的一般形式可以是函数(真值表小提琴):

function xor( a, b ) { return !a ^ !b; }

然后,您的特定示例为:

if ( xor( isEmptyString( firstStr ), isEmptyString( secondStr ) ) ) { ... }

或者,如果300732205135191938048仅返回布尔值,并且您不希望使用通用的300732205135191938049函数,则只需:

if ( isEmptyString( firstStr ) ^ isEmptyString( secondStr ) ) { ... }
Brian North answered 2020-08-11T23:21:40Z
1 votes

Javascript没有逻辑XOR运算符,因此您的构造似乎合理。 如果是数字,则可以使用^,即按位XOR运算符。

干杯

Arnkrishn answered 2020-08-11T23:22:05Z
1 votes

这是一个XOR,可以容纳两个到多个参数

function XOR() {
    for (var i = 1; i < arguments.length; i++) 
        if ( arguments[0] != arguments[i] ) 
            return false; 
    return true; 
}

使用示例:

if ( XOR( isEmptyString(firstStr), isEmptyString(secondStr) ) ) {
    alert(SOME_VALIDATION_MSG);
    return;
}
some young guy answered 2020-08-11T23:22:29Z
1 votes

我希望这将是最短最干净的

function xor(x,y){return true==(x!==y);}

这适用于任何类型

Premchandra Singh answered 2020-08-11T23:22:53Z
0 votes

这是一个XOR函数,它采用可变数量的参数(包括两个)。 参数只需要是真实的或虚假的,而不是truefalse

function xor() {
    for (var i=arguments.length-1, trueCount=0; i>=0; --i)
        if (arguments[i])
            ++trueCount;
    return trueCount & 1;
}

在我的2007 MacBook上的Chrome上,三个参数的运行时间为14 ns。 奇怪的是,此版本稍有不同,三个参数需要2935 ns:

function xorSlow() {
    for (var i=arguments.length-1, result=false; i>=0; --i)
        if (arguments[i])
            result ^= true;
    return result;
}
George answered 2020-08-11T23:23:18Z
0 votes

试试这个: function xor(x,y) var result = x || y if (x === y) { result = false } return result }

Gavriel Feria answered 2020-08-11T23:23:38Z
0 votes

有几种方法,但是三元方法(a?!b:b)似乎表现最好。 另外,如果需要经常对事物进行异或运算,则设置Boolean.prototype.xor似乎是一个选项。

[HTTP://JSP而F.com/xor-implementations]

Fordi answered 2020-08-11T23:24:02Z
0 votes

您可以这样做:

Math.abs( isEmptyString(firstStr) - isEmptyString(secondStr) )

其结果是XOR操作的结果。

Zack answered 2020-08-11T23:24:26Z
0 votes

@george,我喜欢您的函数,因为它可以接受两个以上的操作数。 我做了一些改进,使其返回更快:

function xor() {
    for (var i=arguments.length-1, trueCount=0; i>=0; --i)
        if (arguments[i]) {
            if (trueCount)
                return false
            ++trueCount;
        }
    return trueCount & 1;
}
elfan answered 2020-08-11T23:24:46Z
translate from https://stackoverflow.com:/questions/2335979/is-there-anyway-to-implement-xor-in-javascript