42

I'm trying to implement XOR in javascript in the following way:

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

Is there a better way to do this in javascript?

Thanks.

4

18 に答える 18

34

JavaScriptにはすでにビットごとの論理XORがあるため、論理XORを探しているふりをします(^) :)

私は通常、単純な三項演算子を使用します (めったに使用しません)。

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 演算子を適用します。たぶん、最初のソリューションほどメンテナンスしにくいかもしれません (または、最初のソリューションに慣れすぎているのかもしれません)。

于 2010-02-25T17:18:10.007 に答える
11

ビット単位のXOR(Javascriptにある)にモデル化するのが簡単なブール値のXORを実行しています。

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

if(a ^ b) { ... }

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

于 2010-02-25T17:16:52.070 に答える
8

ビット単位の XOR 演算子 ( ^) を直接使用できます。

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

ブール値truefalse値がに変換され10ビットごとの演算子が 32 ビット整数で機能するため、この例では機能します。

その式は または のいずれかを返し0、その値はステートメント1によって強制的にブール値に戻されます。if

上記のアプローチで発生する型強制に注意する必要があります。優れたパフォーマンスを求めている場合は、ビット単位の演算子を使用することはお勧めしません。ブール論理のみを使用して単純な関数を作成することもできます。演算子:

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


if (xor(isEmptyString(firstStr), isEmptyString(secondStr))) {
  // ...
}
于 2010-02-25T17:21:01.170 に答える
5

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;
}

また

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

また

if( !isEmptyString(firstStr)!= !isEmptyString(secondStr)) {
   alert(SOME_VALIDATION_MSG); 
   return;
}
于 2010-02-25T17:16:07.813 に答える
5

この記事からの引用:

残念ながら、JavaScriptには論理XOR演算子がありません。

XOR演算子の動作は、次のように「エミュレート」できます。

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

リンクされた記事では、いくつかの代替アプローチについて説明しています。

于 2010-02-25T17:16:11.993 に答える
2

BOOLEAN XOR を探していると仮定すると、ここに簡単な実装があります。

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

上記は、「排他的論理和」の定義から導き出された{どちらか一方、両方ではない}。

于 2013-08-21T22:04:13.853 に答える
2

XOR は単に「これら 2 つのブール値は異なるか?」という意味です。したがって:

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

s は、演算子が 2 つの真のブール値を比較!!することを保証するためのものです。これは、おそらく何か他のもの ( false の場合、文字列自体など) を返すためです。!=isEmptyString()null

于 2010-02-25T17:27:28.410 に答える
1

Javascriptには論理XOR演算子がないため、構成はもっともらしいようです。数値であれば、^つまりビット単位のXOR演算子を使用できたはずです。

乾杯

于 2010-02-25T17:18:04.137 に答える
1

これは、2 つから多くの引数に対応できる 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;
}
于 2011-02-14T21:59:35.607 に答える
1

これが最短で最もクリーンなものになることを願っています

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

これはどのタイプでも機能します

于 2013-05-18T10:09:46.420 に答える
0

あなたはこれを行うことができます:

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

その結果は、XOR 演算の結果です。

于 2013-12-20T16:50:32.557 に答える
0

いくつかの方法がありますが、3 項法 (a ? !b : b) が最適に機能するようです。また、頻繁に xor する必要がある場合は、Boolean.prototype.xor の設定がオプションのようです。

http://jsperf.com/xor-implementations

于 2013-12-17T16:37:46.640 に答える
0

これを試して: function xor(x,y) var result = x || y if (x === y) { result = false } return result }

于 2012-12-26T02:27:14.610 に答える
0

@george、私はあなたの関数が2つ以上のオペランドを取る能力が好きです。より速く戻るように少し改善しました:

function xor() {
    for (var i=arguments.length-1, trueCount=0; i>=0; --i)
        if (arguments[i]) {
            if (trueCount)
                return false
            ++trueCount;
        }
    return trueCount & 1;
}
于 2015-06-02T09:02:01.997 に答える
0

以下は、可変数の引数 (2 つを含む) を取る XOR 関数です。引数は true または false である必要があるだけで、 or ではありませtruefalse

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

私の 2007 MacBook の Chrome では、3 つの引数に対して 14 ns で実行されます。奇妙なことに、このわずかに異なるバージョンでは、3 つの引数に 2935 ns かかります。

function xorSlow() {
    for (var i=arguments.length-1, result=false; i>=0; --i)
        if (arguments[i])
            result ^= true;
    return result;
}
于 2012-09-29T03:32:43.790 に答える