javascriptで悩む。
欲しいもの
javascriptでequals()が欲しい、つまり、どういうことかというと
function class(name, age) { this.name = name; this.age = age; } var a1,a2,a3; a1 = new class("yamada",30); a2 = new class("tanaka",35); a1.name; // yamada a2.name; // tanaka a3 = a1; // これはnameがyamadaでageが30のオブジェクト(a1)の別名 a3.name; // yamada a1 == a3; // a1もa3も同じオブジェクトを指しているのでtrue a1 == a2; // a1とa2は別のオブジェクトなのでfalse a2.name = "yamada"; // a1.nameと同じ値を代入してみる a2.age = 30; // a1.ageと同じ値を代入してみる a2.name; // yamada a2.age; // 30 a1 == a2; // false!
値がa1とa2で同じであろうが、指しているメモリの位置が違うので最後の式はfalseとなる。
これを
// こんなのはない a1.eauals(a2) // java風? eq(a1, a2) // c/c++風?
とか、メモリの位置ではなくて中身を見て判定するような関数(か、演算子か、メソッド)。
たぶん、厳密に同値であることを判定するのは難しいはずだ。
だって、こういうことだってできる
a4 = new class("satou",100); a4.name; // satou a4.job = "salary_man"; // function class で定義していないプロパティの代入 a4.job; // salary_man 上で代入した値 a4.call = new function(who){ return "もしもし?" + who + "さんですか?"}; text = a4.call("yamada"); // 関数も代入できる text; // もしもし?yamadaさんですか?
つまり、functionでオブジェクトの雛形は作れるが、参考程度で後からいくらでも付け足すことができる。
とりあえず、その場しのぎなのを承知で、こうしてみた。
function equals(a,b) { var b_ret = true; for(var property in a){ if(a[property] != b[property]) // a.property は a[property]と同じ b_ret = false; } for(var property in b){ if(b[property] != a[property]) b_ret = false; } return b_ret; }
メソッドに、レキシカルクロージャなんかが入ってたらすぐにアウトになりそうなので、使える場面はかなり限られる。
が、とりあえず、今日やりたかった部分はこれで凌ぐことができた。
誰か作ってないかな、と、Google先生にjavascript eauqlsと入れると出てきた。
http://www.mamezou.com/tec/equip014.htm
javascriptでSTL(の一部)を実装している。
面白いが、肝心のequalsがイマイチ。でも、面白い。