2016-08-18 8 views
1

JavaScriptで関数をキーとして使用したいと考えています。私はjsオブジェクトのために、関数が "toString"形式に変換されることを知っています。 2つの関数が同じ本体を持つ場合には問題です。関数はjavascriptマップコレクションの有効なキーですか?

var a = function() {}; 
var b = function() {}; 
var obj={}; 
obj[a] = 1; 
obj[b] = 2; 

obj[a]の値は2が含まれています。

Mapを使用するとうまくいきます。

var a = function() {}; 
var b = function() {}; 
var map = new Map(); 
map.set(a, 1); 
map.set(b, 2); 

map.get(a)の値は1map.get(b)2を返します。

これはすべてのブラウザでサポートされている標準的な動作ですか、これはクロムブラウザのマップコレクションの実装ですか?これを中継することはできますか?どのように機能がマップにハッシュされるのですか?

答えて

7

オブジェクトのプロパティ名は文字列でなければなりません。他の型の値をプロパティキーとして使用しようとすると、その値は最初に文字列に変換されます。

今、マップインスタンスは異なるストーリーです。マップキーは、ES2015の仕様に従って任意のタイプにすることができます(マップをサポートする任意の環境で頼ることができるものです)。

関数値がどのように "ハッシュ"されているかについては、仕様では定義されていません。 2つの関数インスタンスが同じになることはないので、全く同じボディを持つ2つの異なる関数でも、別々のマップキーとして機能します。

関連する問題