この2つの変数があります。
var a = 1,
b = 2;
私の質問は、それらを交換する方法ですか?オブジェクトではなく、この変数のみ。
これは、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>
ES6(FirefoxおよびChromeは既にサポートしています(割り当て配列の一致を破壊する):
let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
あなたはこれを行うことができます:
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・ダイクストラ
以下のコードは使用しないでください。これは、not2つの変数の値を交換する推奨方法です(単純に 一時変数を使用 に)。 JavaScriptのトリックを示しているだけです
このソリューションは、一時変数も配列も使用せず、追加も1つだけで、 fast です。実際、いくつかのプラットフォームで一時変数よりも速い場合があります。
すべての数値で機能し、オーバーフローすることはなく、InfinityやNaNなどのエッジケースを処理します。
a = b + (b=a, 0)
次の2つのステップで機能します。
(b=a, 0)
はb
をa
の古い値に設定し、0
を生成しますa = b + 0
はa
をb
の古い値に設定しますa
とb
が既に存在し、スワップする必要がある値があると仮定すると、1行になります。
var c=a, a=b, b=c;
@Kayが述べたように、これは実際にパフォーマンスが良い配列の方法(ほぼ2倍の速さ)よりも。
ES6以降、変数をよりエレガントに交換することもできます。
var a = 1,
b = 2;
[a, b] = [b, a];
console.log('a:', a, 'b:', b); // a: 2 b: 1
次のような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番目の変数を使用
一時的なスワップ変数またはXORを使用できます。
a = a ^ b
b = a ^ b
a = a ^ b
これは基本的な論理概念であり、XOR操作をサポートするすべての言語で機能します。
編集:コメントを参照してください。これが整数でのみ確実に機能することを伝えるのを忘れました。質問のスレッドから整数変数を想定
ES6 +メソッド:ES6以降、変数をよりエレガントに交換できます。構造化代入配列の一致を使用できます。ただですvar a = 10 b = 20;
[a、b] = [b、a]
console.log(a、b)// 20 10
ES6 Destructuring:
配列の使用:[a, b] = [b, a]; // my favorite
オブジェクトの使用:{a, b} = {a:b, b:a}; // not bad neither
あなたの質問は「この変数のみであり、オブジェクトではありません」という貴重なものであったため、答えも貴重です。
var a = 1、b = 2
a=a+b;
b=a-b;
a=a-b;
それはトリックです
そしてロドリゴ・アシスが言ったように、「短くすることができます」
b=a+(a=b)-b;
これでようやくできるようになりました:
var a = 5;
var b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
これらの古典的なonelinersを逃すことができる方法
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
そして
var a = 1, b = 2
a = (_=b,b=a,_);
最後のものはグローバル変数「_」を公開していますが、典型的なjavascriptの慣例は「dont care」変数として使用することなので、それは問題ではありません。
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つのコードセットで実行します
ES6には破壊的な割り当てがあり、次のことができます。
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
単一行スワッピング
a = a^b^(b^=(a^b));
プログラミングオリンピックのようなものがここにあります。もう1つ注意が必要な1行のソリューション:
b = (function(){ a=b; return arguments[0]; })(a);
let a = 2, b = 4;
[b, a] = [a, b];
より冗長なアプローチは
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
このように変数を交換できます:
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
ES6 destructuring assignment を使用できます:
[a, b] = [b, a];
これは非常に簡単です。詳細は[y, x] = [x, y]
であるES6配列分解構文を使用して、このリンク https:// developerを参照してください。 mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment