swap() 関数を使用すると、インラインで作業を行うよりもクリーンなコード ( DRY ) になります。残念ながら、JavaScript ではパラメーターは常に値渡しであるため、次の関数は何も実行しません。
function swap(a,b) { var temp=a; a=b; b=temp; }
特に数値に対して、これが試みていることを達成する関数を書く方法はありますか?
swap() 関数を使用すると、インラインで作業を行うよりもクリーンなコード ( DRY ) になります。残念ながら、JavaScript ではパラメーターは常に値渡しであるため、次の関数は何も実行しません。
function swap(a,b) { var temp=a; a=b; b=temp; }
特に数値に対して、これが試みていることを達成する関数を書く方法はありますか?
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を回避できます。
私はこのアプローチを見つけましたが、これはそれほど悪くはありません (少なくとも私の目的では):
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()
か? 自分で決める必要がありますが、ここにいくつかの助けがあります:
私が見る最大の懸念は、これが比較的遅くなる可能性があることです (インタープリターがキャッシュを管理する方法によって異なります)。目的に対して遅すぎる場合は、使用しないでください。