2016-05-02 5 views
2

私は2つのクラスを定義するとしましょう。次に、各クラスのオブジェクトを作成します。私はそのクラスに基づいてオブジェクトを取得することができるように、それらのクラスによってキーマップされたマップにオブジェクトを保存します。Javascriptではオブジェクトをキーとして使用するのが効率的ではありませんか?

同じ結果で、次の

// Alternative 1 

class Apple { 
} 

class Banana { 
} 

let fruitInBag = {}; 
fruitInBag[Apple] = new Apple(); 
fruitInBag[Banana] = new Banana(); 

代わりに、私も書くことができる(私はしかし、問題は、関数に置き換えクラスとレガシーJavaScriptが同じままであり、ES6の構文を使用しています)

// Alternative 2 

class Apple { 
} 

class Banana { 
} 

const FRUIT_TYPE_APPLE = 1; 
const FRUIT_TYPE_BANANA = 2; 

let fruitInBag = {}; 
fruitInBag[FRUIT_TYPE_APPLE] = new Apple(); 
fruitInBag[FRUIT_TYPE_BANANA] = new Banana(); 

私はクラス定義とは別に定数を定義して維持しなければならないので、2番目の選択肢は扱いにくいです。したがって、私は最初のものを好むでしょう。しかし、最初のアプローチは非効率的ですか? Objectは、効率的に最初の選択肢を実装するのに十分なスマートですか?

+1

「マップ」についてはどうですか?オブジェクトはそのキーを文字列表現に「正規化」します。 –

+4

キーはクラスではなくクラス名の文字列です。 – jcubic

+0

問題は何ですか? _performance_に関連する質問ですか? – Rayon

答えて

-1

問題のコードスニペットを正しく反映して問題を反映しました。コメントを付けて回答を削除した後、Chrome devtoolsで次のように分析しました。

Map Keys Analysis

あなたが写真から見ることができるように、私はES6(class Apple)とES5(function FnApple)方式の両方でクラスを定義しました。その後、私はそれらを通常のES5オブジェクト(mapA)とそれ以降のES6マップ(mapB)に保管しました。すべての場合、ブラウザはクラス定義を完全にストリング化し、その文字列をキーとして使用します。これは、クラスの完全な文字列化がそれを明確にするために機能します。 (私はストリング化がダンプ[Object]文字列になることを恐れていた)。

しかしこれは、クラスまたは関数オブジェクトをキーとして使用すると、マップキーが不定期に長くなることも意味します。クラスが長い定義を持つ現実のシナリオでは、キーは数KBにまで増えます。これを考えると、マップ内のキーには独立して定義された整数を使用する必要があります。

更新

ES6マップの場合は、上記の私のテストが正しくありません。私はキー値を[]構文を使用してmapBオブジェクトに割り当てました。これにより、キー値がES5のようなオブジェクトのメンバとして格納されます(ES6マップインスタンスもオブジェクトなので)。 ES6マップでキー値を設定する正しい方法は、get()、set()APIを使用することです。これを実行した後、キーのタイプは実際にはfunctionであり、ES6マップではStringではないことがわかります。

Correction

+1

ES6 Mapはキーとして文字列を使用しません! Object自体を使用します。 ES5 polyfillをチェックしてください! – Lux

+0

あなたは正しいです。私はその印象を得るために間違ったことを知っています。答えを更新する。ありがとう。 – Jayesh

1

Javascriptオブジェクトのキーは、常に文字列です。整数も関数もありません(クラス)。これにはES6マップを使用してください!