JSで値を交換する10の方法(共有)

青灯夜游
リリース: 2021-01-08 14:20:14
転載
2767 人が閲覧しました

JSで値を交換する10の方法(共有)

開発プロセスでは、値を交換する必要があります。一般的には、「一時変数」という単純な解決策を使用します。しかし、より良い方法は 1 つだけではなく、たくさんあります。時々、オンラインで解決策を検索し、見つけたらコピーして貼り付けますが、この小さなコードがどのように機能するかについては決して考えません。今度は、簡単かつ効率的に値を交換する方法を学びましょう。

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)
ログイン後にコピー

2. 算術演算子と -

を使用する 数学的魔法を使用して値を交換することもできます。

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行目のnum1num2の値が得られます。

注意: ただし、 および - に代わるワンライナーの方法もあります。 。 。

これは次のようになります:

function swapWithPlusMinusShort(num1,num2){
  console.log(num1,num2)

  num2 = num1+(num1=num2)-num2;

  console.log(num1,num2)
}

swapWithPlusMinusShort(2,3)
ログイン後にコピー

上記のコードは期待どおりの結果を返します。 () の式は、num2num1 に格納し、 を減算することに加えて、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)
ログイン後にコピー

3. or 演算子を使用するだけです

演算子を使用するだけです 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行目の()では、num1num2に代入しており、その隣の0が戻り値です。つまり、4 行目の演算ロジックは次のとおりです。

num2 = num1 + 0 
=> num2 = num1.
ログイン後にコピー

したがって、正しい結果が得られます。

: 一部の JavaScript エンジンは、 0 を無視するように上記のコードを最適化する場合があります。

4. 算術演算子 * と /

を使用する # 演算子と / 演算子を使ってさらにトリックを実行しましょう。

原理は前の方法と同じですが、いくつかの小さな問題があります。

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)
ログイン後にコピー

上のコードは似ています - を交換するときのコードを短くします。 num2num1 に代入すると、4 行目の計算ロジックは次のようになります。

num2 = num1 * num2 / num2
    => num2 = num1
ログイン後にコピー

このようにして、2 つの値が入れ替わります。

5. * または / 演算子のみを使用してください

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 行目の () では、num1num2 に代入しており、その隣の 1 が戻り値です。簡単に言うと、4 行目のロジックは次のようになります。

num2 = num1 * 1 
    => num2 = num1
ログイン後にコピー

これで結果が得られます。

6. ビット単位の排他的論理和 (XOR) を使用します。

XOR は、バイナリ ビット演算を実行するために使用されます。 2 つの異なる入力がある場合、結果は 1 になり、それ以外の場合は 0 になります。

XXYXX^Y#1 10101011000##

先了解其工作原理!

function swapWithXOR(num1,num2){
  console.log(num1,num2)

  num1 = num1^num2;
  num2 = num1^num2; 
  num1 = num1^num2;

  console.log(num1,num2)
}
// 试试负值会怎样
swapWithXOR(10,1)
ログイン後にコピー

10 的4 位二进制数 -> 1010

1 的 4 位二进制数 -> 0001

现在:

第四行: 
num1 = num1 ^ num2 
    => 1010 ^ 0001 
    => 1011 
    => 7 
第五行: 
num2 = num1 ^ num2 
    => 1011 ^ 0001 
    => 1010 
    => 10
第六行: 
num1 = num1 ^ num2 
    => 1011 ^ 1010 
    => 0001 
    => 1
ログイン後にコピー

两个值交换了。

再来看另一个例子:

function swapWithXOR(num1,num2){
  console.log(num1,num2)

  num1 = num1^num2;
  num2 = num1^num2;
  num1 = num1^num2;

  console.log(num1,num2)
}

swapWithXOR(2.34,3.45)
ログイン後にコピー

嗯??交换的值在哪儿?我们只是得到了数字的整数部分,这就是问题所在。 XOR 假定输入是整数,所以···相应地执行计算。但是浮点数不是整数,而是由 IEEE 754 标准表示的,将数字分为三部分:符号位、代表指数的一组位和代表尾数的一组位。位数是介于1(含)和2(不含)之间的数字。所以得到的值不正确。

另一个例子:

function swapWithXOR(num1,num2){
  console.log(num1,num2)

  num1 = num1^num2;
  num2 = num1^num2;
  num1 = num1^num2;

  console.log(num1,num2)
}
// 试试 infinities 和整数值.
swapWithXOR(-Infinity,Infinity)
ログイン後にコピー

毫无意外,我们没有得到预期的结果。这是因为 Infinity– Infinity 都是浮点数。正如我们在前面所讨论的,对于 XOR,浮点数是一个问题。

7、使用按位同或 (XNOR)

它用来进行二进制位运算,但是与 XOR 正好相反。当有两个不同的输入时,XNOR 的结果是 0,否则结果为 1。 JavaScript 没有执行 XNOR 的运算符,所以要用 NOT 运算符对 XOR 的结果求反。

XYXNOR
111
100
010
001

先了解其工作原理:

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)
ログイン後にコピー

8、在数组中进行赋值

这是一线技巧。只需要一行代码就可以进行交换,更重要的是,无需数学运算,只需要数组的基本知识。不过它看上去可能很奇怪。

先让看看它的实际效果:

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 中。而且可以在这里交换我们想要的任何东西,比如:整数、浮点数(包括无穷数)以及字符串。看上去很整洁,但是在这里失去了代码的清晰度。

9、使用解构表达式

这是 ES6 的功能。这是所有方法中最简单的。只需要一行代码就可以完成交换:

let num1 = 23.45;
let num2 = 45.67;

console.log(num1,num2);

[num1,num2] = [num2,num1];

console.log(num1,num2);
ログイン後にコピー

10、使用立即调用的函数表达式(IIFE)

这是最奇怪的一个。简单的说 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート