如何在JavaScript中定义对象的比较方式

时间:2009-01-13 22:38:57

标签: javascript comparison equals

我想定义一个JavaScript类,Foo。

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

我将创建我的Foo的“实例”:

foo1 = new Foo(1);
foo2 = new Foo(1);

我希望我的Foo实例可以使用标准==相等运算符相互比较:

foo1 == foo2;      // this should be true

我找不到办法做到这一点。我以为我使用的是valueOf()函数,但这只有在比较的一边是基元时才有用,而不是上面两者都是object类型。

我错过了一些非常简单的东西,比如Ruby的

def ==(obj); end

4 个答案:

答案 0 :(得分:6)

JavaScript没有运算符重载。请参阅this discussion,了解您的问题。

答案 1 :(得分:4)

不是一个干净的方式......

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

覆盖您自己对象的toString函数:

Foo.prototype.toString = function( ){ return this.value.toString(); }

创建两个测试对象:

foo1 = new Foo(1);
foo2 = new Foo(1);

如果对象的值是字符串或数字,则可以使用javascript引擎将对象转换为字符串,方法是将它们添加到空字符串中:

alert( ""+foo1 === ""+foo2 ); //Works for strings and numbers

同样的事情,但更清洁:

alert( foo1.toString() === foo2.toString() ); //Works for strings and numbers

如果对象的值仅为数字,则可以使用一元+运算符将对象转换为数字:

alert( +foo1 === +foo2 ); //Works for numbers

但是,我建议您同时定义toString,并且等于:

Foo.prototype.equals=function(b){return this.toString() === b.toString();}

然后像这样称呼它:

alert ( foo1.equals(foo2) );

由于您现在已经定义了toString,您可以:

alert(foo1); // Alerts the value of foo1 instead of "[Object object]"
alert("foo1: " + foo1); // Alerts "foo1: 1". Useful when debugging. 

答案 2 :(得分:1)

我认为这不可能使用javascript。你必须编写自己的函数,例如isEqual()

答案 3 :(得分:0)

JavaScript在这方面就像它的同名Java:没有运算符重载。请改用equals()等自定义方法。