オブジェクトをプロパティキーにするとtoString()した値が使われる
今日はまったところ。
JavaScriptのオブジェクトはハッシュマップのように任意のキーと値を関連づけて保持してくれますが、オブジェクトをキーにした場合、それをtoString()した値がキーとして使われます。
- 比較には==や===は使われません。
- 同じと見なす条件をカスタマイズするにはhashCodeやequals()をオーバーライドする代わりに(そもそもそんなものはないけど)、toString()をオーバーライドします。
→Core JavaScript 1.5 Reference:Operators:Member Operatorsより。
var stdout = document.getElementById("stdout"); var map = {}; var key1 = new Object(); var key2 = new Object(); stdout.innerHTML += "key1 == key2 :" + (key1 == key2) + "<br/>"; // false stdout.innerHTML += "key1 === key2 :" + (key1 === key2) + "<br/>"; // false stdout.innerHTML += "key1.toString == key2.toString :" + (key1.toString == key2.toString) + "<br/>"; // true // toStringの値は同じなのでkey1とkey2は同じと見なされる。 map[key1] = 1; map[key2] = 2; stdout.innerHTML += "map[key1] :" + map[key1] + "<br/>"; // 2 stdout.innerHTML += "map[key2] :" + map[key2] + "<br/>"; // 2 // toStringをオーバーライドする。// key1とkey2が別物扱いになる。 key1.toString = function() { return "key1"; } key2.toString = function() { return "key2"; } map[key1] = 1; map[key2] = 2; stdout.innerHTML += "map[key1] :" + map[key1] + "<br/>"; // 1 stdout.innerHTML += "map[key2] :" + map[key2] + "<br/>"; // 2
この仕様だと、以下のようなことは難しそうだなー。