無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

オブジェクトをプロパティキーにすると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

確認はこちらから。

この仕様だと、以下のようなことは難しそうだなー。