2012-04-26 10 views
16

Tengo una clase personalizada que tiene varios miembros. Necesito compararlos el uno al otro. javascript me permite escribir:Cómo realizar comparaciones menores que/mayores que en objetos personalizados en javascript

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

pero no entiendo el comportamiento de la comparación lógica. ¿Alguien puede explicar la semántica de la comparación < en el código anterior? ¿Hay alguna manera de controlar lo que sucede para que pueda obtener un comportamiento correcto? Sé que puedo escribir un método de comparación para la clase, pero dado que javascript me permite escribirlo, me pregunté qué pensaba que estaba haciendo.

Gracias.

Respuesta

24

es necesario definir un método .valueOf que devuelve una primitiva que puede ser utilizado para la comparación:

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 

Si no lo define, la cadena de la "[object Object]" se utiliza para la comparación:

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

Wow, eso es como una interfaz de IComparable para JavaScript. –

+1

@Jay al comparar objetos para igualdad ('==', '==='), siempre comparará referencias (si los 2 operandos apuntan al mismo objeto exacto en la memoria). Necesitas definir un método como '.isEqual' y llamarlo normalmente' a.isEqual (b) ' – Esailija

+0

Gracias. Eso es perfecto. Sin embargo, es una pena que tampoco funcione == o ===. Es extraño que no pude encontrar esta solución en ninguna parte de la red. – drdwilcox

Cuestiones relacionadas