2012-04-26 12 views
16

私はいくつかのメンバーを持つカスタムクラスを持っています。私はそれらをお互いに比較する必要があります。 JavaScriptは私に書くことができます:javascriptのカスタムオブジェクトで以下の比較を実行する方法

var a = new MyType(1); 
var b = new MyType(2); 
if (a < b) { ... 

しかし、私は論理比較の動作を理解していません。誰かが上記のコードで<比較のセマンティクスを説明できますか?私は正しい行動をとれるように何が起こるかを制御する方法はありますか?私はクラスの比較メソッドを書くことができることを知っているが、javascriptは私がそれを書くことができるので、私はそれが何をしていると思ったのだろうかと思った。

ありがとうございました。

答えて

24

あなたは比較のために使用することができるプリミティブを返す.valueOf方法を定義する必要があります:あなたはそれを定義しない場合、文字列"[object Object]"を比較するために使用されている

function MyType(value){ 
    this.value = value; 
} 

MyType.prototype.valueOf = function() { 
    return this.value; 
}; 

var a = new MyType(3), 
    b = new MyType(5); 

a < b 
true 
a > b 
false 
a >= b 
false 
b < a 
false 
b > a 
true 

を:

"[object Object]" < "[object Object]" 
false 
"[object Object]" > "[object Object]" 
false 
"[object Object]" >= "[object Object]" 
true 
"[object Object]" <= "[object Object]" 
true 
+0

うわーは、JavaScript用のIComparableインターフェイスに似ています。 –

+1

@Jayオブジェクトを等価( '=='、 '===')で比較すると、常に2つのオペランドがメモリ内の同じ正確なオブジェクトを指しているかどうかを比較します。 '.isEqual'のようなメソッドを定義し、通常は' a.isEqual(b) 'と呼びます。 – Esailija

+0

ありがとう。それは最高です。しかし、それは==または===のどちらかを作っていないという事実はあります。奇妙なことに、私はこのソリューションをネット上のどこにも見つけることができませんでした。 – drdwilcox

関連する問題