js中比较两个对象时,比较的是引用而不值。要判断两个对象是否引用的是一个对象,不是检查这个对象是否具有相同的属性名和相的属性值,而是直接比较这两个单独的对象是否相等。Java编程语言有很多用于对象比较的方法,将java中的这些方法借用到js中是一个不错的主意,这个方法只能接受一个实参,如果这个实参和调用此方法的对象相等的话则返回true。当然这里所说的“相等”的含义是根据类的上下文来决定的。对一简单的类,可以通过简单地比较它们的constructor属性来确保两个对象是相同类型。然后比较两个对象的实例属性以保证它们的值相等。
如下:给Set添加equals()方法
Set.prototype.equals = function(that){
if(this===that) return true;
if(!(that instanceof Set)) return false;
if(this.size()!=that.size()) return false;
try{
this.foreach(function(v){if(!that.contains(v)){throw false;});
return true;
}catch(x){
if(x===false) return false;
throw x
}
}
同样道理我们可以定义一个compareTo方法,如给Range类加一个这样的方法
Range.prototype.compareTo = function(that){
if(!(that instanceof Range)){
throw new Error("Can't compare a Rangewith"+that);
}
var diff = this.from-that.from;
if(diff==0)diff=this.to-that.to;
return diff;
}
则我们对range对象数组排序可以如:
ranges.sort(function(a,b){return a.compareTo(b);});