web-dev-qa-db-ja.com

JavaScriptで2つの変数を交換する方法

この2つの変数があります。

var a = 1,
    b = 2;

私の質問は、それらを交換する方法ですか?オブジェクトではなく、この変数のみ。

142
Lukas

これは、2つの変数の値を交換するためのワンライナーです。

b = [a, a = b][0];

スニペット:

var a=1,
    b=2,
    output=document.getElementById('output');

output.innerHTML="<p>Original: "+a+", "+b+"</p>";

b = [a, a = b][0];

output.innerHTML+="<p>Swapped: "+a+", "+b+"</p>";
<div id="output"></div>
291
showdev

ES6(FirefoxおよびChromeは既にサポートしています(割り当て配列の一致を破壊する):

let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
135
Pedro Justo

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

var a = 1,
    b = 2,
    tmp;
tmp = a;
a = b;
b = tmp;

読みやすさと保守性のために、これは(少なくともJavaScriptで)負けません。コードを管理している人なら誰でも(今から6か月後を含む)、何が起こっているかを正確に知っているでしょう。

これらは整数であるため、任意の数の巧妙なトリックを使用することもできます1 3番目の変数を使用せずにスワップします。たとえば、ビット単位のxor演算子を使用できます。

var a = 1,
    b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;

これは、XORスワップアルゴリズムと呼ばれます。その動作理論は このWikipediaの記事 で説明されています。

1」有能なプログラマーは、自分の頭蓋骨の限られたサイズを完全に認識しています。したがって、彼は完全な謙虚さで仕事に取り組み、ペストのような巧妙なトリックを避けます。」—エドガー・W・ダイクストラ

117
Ted Hopp

以下のコードは使用しないでください。これは、not2つの変数の値を交換する推奨方法です(単純に 一時変数を使用 に)。 JavaScriptのトリックを示しているだけです

このソリューションは、一時変数も配列も使用せず、追加も1つだけで、 fast です。実際、いくつかのプラットフォームで一時変数よりも速い場合があります
すべての数値で機能し、オーバーフローすることはなく、InfinityやNaNなどのエッジケースを処理します。

a = b + (b=a, 0)

次の2つのステップで機能します。

  • (b=a, 0)baの古い値に設定し、0を生成します
  • a = b + 0abの古い値に設定します
56
Ruben Verborgh

abが既に存在し、スワップする必要がある値があると仮定すると、1行になります。

var c=a, a=b, b=c;

@Kayが述べたように、これは実際にパフォーマンスが良い配列の方法(ほぼ2倍の速さ)よりも。

17
bobobobo

ES6以降、変数をよりエレガントに交換することもできます。

var a = 1,
    b = 2;

[a, b] = [b, a];

console.log('a:', a, 'b:', b); // a: 2 b: 1
13
Peter

次のような3番目の変数を使用します。

var a = 1,
    b = 2,
    c = a;

a = b; // must be first or a and b end up being both 1
b = c;

DEMO -3番目の変数を使用


9
Nope

一時的なスワップ変数またはXORを使用できます。

a = a ^ b
b = a ^ b
a = a ^ b

これは基本的な論理概念であり、XOR操作をサポートするすべての言語で機能します。

編集:コメントを参照してください。これが整数でのみ確実に機能することを伝えるのを忘れました。質問のスレッドから整数変数を想定

8
DmiN

ES6 +メソッド:ES6以降、変数をよりエレガントに交換できます。構造化代入配列の一致を使用できます。ただですvar a = 10 b = 20;

[a、b] = [b、a]

console.log(a、b)// 20 10

7
Jalak Patoliya

ES6 Destructuring:

配列の使用:[a, b] = [b, a]; // my favorite

オブジェクトの使用:{a, b} = {a:b, b:a}; // not bad neither

6
Flavien Volken

あなたの質問は「この変数のみであり、オブジェクトではありません」という貴重なものであったため、答えも貴重です。

var a = 1、b = 2

a=a+b;
b=a-b;
a=a-b;

それはトリックです

そしてロドリゴ・アシスが言ったように、「短くすることができます」

 b=a+(a=b)-b;

デモ: http://jsfiddle.net/abdennour/2jJQ2/

6
Abdennour TOUMI

これでようやくできるようになりました:

var a = 5;
var b = 10;

[a, b] = [b, a]; // ES6

console.log(a, b);
6
mehulmpt

これらの古典的なonelinersを逃すことができる方法

var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;

そして

var a = 1, b = 2
a = (_=b,b=a,_);

最後のものはグローバル変数「_」を公開していますが、典型的なjavascriptの慣例は「dont care」変数として使用することなので、それは問題ではありません。

3
Teemu Ikonen
var a = 5;
var b = 10;

b = [a, a = b][0];
//or
b = [a, a = b];
b = b[0];

//or
b = [a, b];
a = b[1];
b = b[0];


alert("a=" + a + ',' + "b=" + b);

2つの// orを削除またはコメント化し、1つのコードセットで実行します

http://jsfiddle.net/USdv8/57/

2
Thilak Raj

ES6には破壊的な割り当てがあり、次のことができます。

let a = 1;
let b = 2;
[b, a] = [a, b]  // a = 2, b = 1
2

単一行スワッピング

a = a^b^(b^=(a^b));
2
Saruselvi

プログラミングオリンピックのようなものがここにあります。もう1つ注意が必要な1行のソリューション:

b = (function(){ a=b; return arguments[0]; })(a);

フィドル: http://jsfiddle.net/cherniv/4q226/

1
Cherniv
let a = 2, b = 4;
[b, a] = [a, b];

より冗長なアプローチは

let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
1
Enogwe Victor

このように変数を交換できます:

var val1 =  117,
    val2 = 327;

val2 = val1-val2; 
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
1
Mohammed Javed

ES6 destructuring assignment を使用できます:

[a, b] = [b, a];
1
Manuel Abascal

これは非常に簡単です。詳細は[y, x] = [x, y]であるES6配列分解構文を使用して、このリンク https:// developerを参照してください。 mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

0
Naved Ahmad