2017-02-16 7 views
0

私はビットOCDを取得し、これを取り除きたいよ:Javascriptに重複宣言の最適化はありますか?

const idSet = new Set(ids) 

私は唯一のパラメータとして2つの異なる機能にそれを渡すためにそれを使用します。

new Set(ids)を2回呼び出せるようにしたいが、V8エンジン(Node.jsのコードを実行している)がこれを最適化するかどうかはわからない。それはただ1つのSetを作成する必要があります(Setを渡す関数もSetを変更しないようにする必要があります)。

は誰もが知っています:

a)の最適化が起こるんか。 b)実際に起こったことをチェックするために人々が何をするか(好奇心から)。

おかげ

編集:私は以上の騒ぎだったもの

// I wanted to change something like this: 
const idSet = new Set(ids) 
const r1 = fn1(idSet) 
const r2 = fn2(idSet) 
// to this: 
const r1 = fn1(new Set(ids)) 
const r2 = fn2(new Set(ids)) 

を今、私はそれについて考える、おそらくこのような何かをして、いくつかの高次機能のパターンがあります(または、私は1つ書くことができる...しかし、それは少ないコードの本来の目的を破るだろう):

const [r1, r2] = hof([fn1, fn2], new Set(ids)) 

さらに正当化:idsは配列です。私はそれをfn1fn2のセットにする必要があったが、呼び出しコードはそれをセットにする必要はなく、余分な変数を必要としない。idSetは、idsしか使用していないときに横たわっていた。ランタイムは2つの別個のセットを作成します...それは無駄ですので、それはそのままです。

+0

私はそれを取得しません。なぜ2つのセットを作成したいが、1つのセットだけを作成したいのですか? – Bergi

+1

私は参照してください。ローカル変数を恐れないで安価で分かりやすくする:-)グローバルスコープの場合は、次のようにIIFEを使います: 'const [r1、r2] =(idSet => [fn1(idSet)、fn2(idSet )]))(新しいSet(ids)); ' – Bergi

答えて

1

いいえ、V8に実装されているhash consingのようなものはありません。これは、JSオブジェクト(Setを含む)がデフォルトで変更可能であるため、かなり複雑になります。

あなたのケースでは、セットを一度だけインスタンス化し、それを2つの異なる変数に割り当てます。また、スコープを共有せずに、プログラムの2つの部分を共有する場合は、idsオブジェクトのプロパティとして権利として保存することもできます。

関連する問題