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

Chr*_*loe 7 javascript comparison equals

我想定义一个JavaScript类,Foo.

Foo = function(value){
    this.value = value;
};
Run Code Online (Sandbox Code Playgroud)

我将创建我的Foo的"实例":

foo1 = new Foo(1);
foo2 = new Foo(1);
Run Code Online (Sandbox Code Playgroud)

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

foo1 == foo2;      // this should be true
Run Code Online (Sandbox Code Playgroud)

我找不到办法做到这一点.我以为我正在使用该valueOf()函数,但这仅在比较的一侧是基元时才有用,而不是如上所述两者都是对象类型.

我是否遗漏了一些非常类似于Ruby的东西

def ==(obj); end
Run Code Online (Sandbox Code Playgroud)

Cre*_*esh 6

JavaScript没有运算符重载.请参阅此讨论,了解您的问题.


som*_*ome 5

不是以一种干净的方式...

Foo = function (value){
    this.value = value;
};
Run Code Online (Sandbox Code Playgroud)

重写你自己的对象的 toString 函数:

Foo.prototype.toString = function( ){ return this.value.toString(); }
Run Code Online (Sandbox Code Playgroud)

创建两个测试对象:

foo1 = new Foo(1);
foo2 = new Foo(1);
Run Code Online (Sandbox Code Playgroud)

如果对象的值是字符串或数字,则可以让 javascript 引擎通过将对象添加到空字符串来将对象转换为字符串:

alert( ""+foo1 === ""+foo2 ); //Works for strings and numbers
Run Code Online (Sandbox Code Playgroud)

相同的东西但更干净:

alert( foo1.toString() === foo2.toString() ); //Works for strings and numbers
Run Code Online (Sandbox Code Playgroud)

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

alert( +foo1 === +foo2 ); //Works for numbers
Run Code Online (Sandbox Code Playgroud)

但是,我建议您既定义上面的 toString 又定义 equals:

Foo.prototype.equals=function(b){return this.toString() === b.toString();}
Run Code Online (Sandbox Code Playgroud)

然后这样称呼它:

alert ( foo1.equals(foo2) );
Run Code Online (Sandbox Code Playgroud)

既然您现在已经定义了 toString,您可以:

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