3

swap() 関数を使用すると、インラインで作業を行うよりもクリーンなコード ( DRY ) になります。残念ながら、JavaScript ではパラメーターは常に値渡しであるため、次の関数は何も実行しません。

function swap(a,b) { var temp=a; a=b; b=temp; }

特に数値に対して、これが試みていることを達成する関数を書く方法はありますか?

この関連する質問への回答には感銘を受けません。
この回答には正しい考えがありますが、一般的なケースは扱いません。

4

4 に答える 4

-2

swap(a,b) を C のように機能させるには、変数への参照が必要です。上記の回答1よりも軽くできます。

function swap(n, m) {
    var temp = this[n];
    this[n] = this[m];
    this[m] = temp;
  }

この関数の this はwindow、call はswap('a', 'b')です。確かに、論理または算術 ( intの場合) でローカル変数tempを回避できます。

于 2015-10-02T21:51:01.227 に答える
-3

私はこのアプローチを見つけましたが、これはそれほど悪くはありません (少なくとも私の目的では):

function swap( swap_name_a, swap_name_b )
   {
   eval
      (
      "var swap_temp="+swap_name_a+";"
    + swap_name_a+"="+swap_name_b+";"
    + swap_name_b+"=swap_temp;"
      );
   }

引数を引用する必要があります。

swap('a','b');

より複雑な引数でも機能するようです。

swap('list[index1]','list[index2]');

注: swap() 関数は、名前付き引数にアクセスする必要があるため、使用される各スコープ内に実装する必要があります。これは「自分で繰り返さない」という原則に反しますが、状況によっては、このようなボイラープレート コードを少しコピー アンド ペーストしても、アルゴリズム ロジックが単純化される場合は許容される場合があります。


ちなみに、私がこれを導き出した例では、swap() から文字列を返し、呼び出し元が文字列を eval: に転送することに依存していましたeval(swap('a','b'))。これにより、スコープの問題は解決されますが、スワップ操作はエラーが発生しやすくなり、魅力的ではなくなります。

注意してください、その情報源はまた、この方法は挑発につながる可能性があると警告しました.


を使用すると、タイムトラベルする宇宙吸血鬼がクレジット カードを盗みますeval()か? 自分で決める必要がありますが、ここにいくつかの助けがあります:

私が見る最大の懸念は、これ比較的遅くなる可能性があることです (インタープリターがキャッシュを管理する方法によって異なります)。目的に対して遅すぎる場合は、使用しないでください。

于 2013-09-15T22:39:32.683 に答える