開発プロセスでは、値を交換する必要があります。一般的には、「一時変数」という単純な解決策を使用します。しかし、より良い方法は 1 つだけではなく、たくさんあります。時々、オンラインで解決策を検索し、見つけたらコピーして貼り付けますが、この小さなコードがどのように機能するかについては決して考えません。今度は、簡単かつ効率的に値を交換する方法を学びましょう。
最初に最も単純な変数を使用します。
function swapWithTemp(num1,num2){ console.log(num1,num2) var temp = num1; num1 = num2; num2 = temp; console.log(num1,num2) } swapWithTemp(2.34,3.45)
を使用する 数学的魔法を使用して値を交換することもできます。
function swapWithPlusMinus(num1,num2){ console.log(num1,num2) num1 = num1+num2; num2 = num1-num2; num1 = num1-num2; console.log(num1,num2) } swapWithPlusMinus(2.34,3.45)
それがどのように機能するかを見てみましょう。 4 行目で 2 つの数値の合計を取得します。ここで、合計から 1 つの数値を引くと、もう 1 つの数値が正しいことになります。これが 5 行目で行われていることです。 num1
変数に格納された合計から num2
を減算すると、元の num1
値が num2
に格納されます。同様に6行目のnum1
でnum2
の値が得られます。
注意: ただし、
および -
に代わるワンライナーの方法もあります。 。 。
これは次のようになります:
function swapWithPlusMinusShort(num1,num2){ console.log(num1,num2) num2 = num1+(num1=num2)-num2; console.log(num1,num2) } swapWithPlusMinusShort(2,3)
上記のコードは期待どおりの結果を返します。 ()
の式は、num2
を num1
に格納し、 を減算することに加えて、
num1 - num2 を減算します。 num2 - num2 = 0
、つまり結果は次のとおりです。ただし、浮動小数点数を扱う場合は、予期しない結果が生じることがあります。
次のコードを実行して結果を確認してください:
function swapWithPlusMinusShort(num1,num2){ console.log(num1,num2) num2 = num1+(num1=num2)-num2; console.log(num1,num2) } swapWithPlusMinusShort(2,3.1)
演算子を使用するだけです Achieve
と -
を同時に使用しても同じ結果になります。
以下のコードを見てください:
function swapWithPlus(num1,num2){ console.log(num1,num2) num2 = num1 + (num1=num2, 0) console.log(num1,num2) } //Try with - operator swapWithPlus(2.3,3.4)
上記のコードは有効ですが、読みやすさが犠牲になります。 4行目の()
では、num1
をnum2
に代入しており、その隣の0
が戻り値です。つまり、4 行目の演算ロジックは次のとおりです。
num2 = num1 + 0 => num2 = num1.
したがって、正しい結果が得られます。
注: 一部の JavaScript エンジンは、 0
を無視するように上記のコードを最適化する場合があります。
を使用する # 演算子と
/
演算子を使ってさらにトリックを実行しましょう。
原理は前の方法と同じですが、いくつかの小さな問題があります。
function swapWithMulDiv(num1,num2){ console.log(num1,num2) num1 = num1*num2; num2 = num1/num2; num1 = num1/num2; console.log(num1,num2) } swapWithMulDiv(2.34,3.45)
前の方法と同じです。まず 2 つの数値の積を取得し、num1
に格納します。次に、5 行目で、num2
をこの結果で除算して最初の数値を取得し、このプロセスを繰り返して 2 番目の数値を取得します。
これであなたは「数学者」になりました。
しかし、小さな問題はどこにあるのでしょうか?
試してみましょう:
function swapWithMulDiv(num1,num2){ console.log(num1,num2) num1 = num1*num2; num2 = num1/num2; num1 = num1/num2; console.log(num1,num2) } //试着改变数字的值,看看会发生什么 swapWithMulDiv(2.34,0)
値を交換する代わりに、何が起こっているのか奇妙な NaN
が得られます。小学校の算数の授業を思い出すと、意味がわからないので 0 で割らないことを覚えているでしょう。
次に、このアプローチに関する他の問題を見てみましょう。次のコードを見てください。
function swapWithMulDiv(num1,num2){ console.log(num1,num2) num1 = num1*num2; num2 = num1/num2; num1 = num1/num2; console.log(num1,num2) } //看看会发生什么 swapWithMulDiv(2.34,Infinity)
はい、また NaN です。 Infinity
を使用して値を削除することはできないため、値は未定義です。
しかし、もう一度試してみたいと思います:
function swapWithMulDiv(num1,num2){ console.log(num1,num2) num1 = num1*num2; num2 = num1/num2; num1 = num1/num2; console.log(num1,num2) } //会怎样呢 swapWithMulDiv(2.34,-Infinity)
-Infinity 同じ理由で、結果は前のコードと同じになります。
あなたが優秀な「数学者」であっても、時には無力であることが分かりました。
これは、*
と /
を使用した値交換の短いバージョンですが、同じ問題がまだあります:
function swapWithMulDivShort(num1,num2){ console.log(num1,num2) num2 = num1*(num1=num2)/num2; console.log(num1,num2) } swapWithMulDivShort(2.3,3.4)
上のコードは似ています
と -
を交換するときのコードを短くします。 num2
を num1
に代入すると、4 行目の計算ロジックは次のようになります。
num2 = num1 * num2 / num2 => num2 = num1
このようにして、2 つの値が入れ替わります。
function swapWithMul(num1,num2){ console.log(num1,num2) num2 = num1 * (num1=num2, 1) console.log(num1,num2) } //Try with / and ** operator swapWithMul(2.3,3.4)
上記のプログラムは有効ですが、読みやすさが犠牲になります。 4 行目の ()
では、num1
を num2
に代入しており、その隣の 1
が戻り値です。簡単に言うと、4 行目のロジックは次のようになります。
num2 = num1 * 1 => num2 = num1
これで結果が得られます。
XOR は、バイナリ ビット演算を実行するために使用されます。 2 つの異なる入力がある場合、結果は 1 になり、それ以外の場合は 0 になります。
Y | XX^Y | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | ||||||||||||||||
0 | 1 | ||||||||||||||||
1 | 1 | ||||||||||||||||
0 | 0 | ## |
X | Y | XNOR |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 1 |
先了解其工作原理:
function swapWithXNOR(num1,num2){ console.log(num1,num2) num1 = ~(num1^num2); num2 = ~(num1^num2); num1 = ~(num1^num2); console.log(num1,num2) } //可以试试负值 swapWithXNOR(10,1)
10 的 4 位二进制数 -> 1010
1 的 4 位二进制数 -> 0001
第 4 行:
num1 = ~(num1 ^ num2) => ~(1010 ^ 0001) =>~(1011) => ~11 => -12
由于这是一个负数,所以需要将其转换回二进制并计算 2 的补码来获取十进制值,例如:
-12 => 1100 => 0011 + 1 => 0100
第 5 行:
num2 = ~(num1 ^ num2) => ~(0100 ^ 0001) => ~(0101) => ~5 => -6-6 => 0110 => 1001 + 1 => 1010 => 10
第 6 行:
num1 = ~(num1 ^ num2) => ~(0100^ 1010) => ~(1110) => ~14 => -15-15 => 1111 => 0000 + 1 => 0001 => 1
花了一些时间,但还是交换了值。但不幸的是,它遇到了与 XOR 相同的问题,不能处理浮点数和无穷大。
试试下面的值:
function swapWithXNOR(num1,num2){ console.log(num1,num2) num1 = ~(num1^num2); num2 = ~(num1^num2); num1 = ~(num1^num2); console.log(num1,num2) } swapWithXNOR(2.3,4.5)
这是一线技巧。只需要一行代码就可以进行交换,更重要的是,无需数学运算,只需要数组的基本知识。不过它看上去可能很奇怪。
先让看看它的实际效果:
function swapWithArray(num1,num2){ console.log(num1,num2) num2 = [num1, num1 = num2][0]; console.log(num1,num2) } swapWithArray(2.3,Infinity)
在数组的下标 0 位置中存储 num1
,在下标 1 中,既将 num2
分配给 num1
,又存储了 num2
。另外,我们只是访问 [0]
,将数组中的 num1
值存储在 num2
中。而且可以在这里交换我们想要的任何东西,比如:整数、浮点数(包括无穷数)以及字符串。看上去很整洁,但是在这里失去了代码的清晰度。
这是 ES6 的功能。这是所有方法中最简单的。只需要一行代码就可以完成交换:
let num1 = 23.45; let num2 = 45.67; console.log(num1,num2); [num1,num2] = [num2,num1]; console.log(num1,num2);
这是最奇怪的一个。简单的说 IIFE 是在在定义后立即执行的函数。
可以用它来交换两个值:
function swapWithIIFE(num1,num2){ console.log(num1,num2) num1 = (function (num2){ return num2; })(num2, num2=num1) console.log(num1,num2) } swapWithIIFE(2.3,3.4)
在上面的例子中,在第4行立即调用一个函数。最后的括号是该函数的参数。第二个参数将 num1
赋值给 num2
,仅仅返回第一个参数,不过这种交换方法效率不高。
本文探讨了用于在 JavaScript 中对值进行交换的众多方法。希望对你有所帮助!
本文转载自:https://codeburst.io/10-ways-to-swap-values-in-javascript-8a1d056352dd
作者:Piyush Kochhar
更多编程相关知识,请访问:编程教学!!
以上がJSで値を交換する10の方法(共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。