我正尝试使用equals和compareTo方法实现自定义的相等和关系运算。但是,我得到了错误的结果。请帮助我找出错误的地方。
var Person = function () {
this.age = null;
this.name = null;
};
Person.prototype.equals = function (that) {
if (this.age === that.age) return true;
else return false;
};
Person.prototype.compareTo = function (that) {
return this.age - that.age;
};
var p1 = new Person();
var p2 = new Person();
p1.age = 10;
p2.age = 20;
document.writeln(p1 < p2); // this should be true but evaluates to false.
2条答案
按热度按时间2w2cym1i1#
JavaScript没有运算符重载,
>
不调用对象上的任何方法,因此p1 < p2
不会使用您的equals
或compareTo
。要进行比较,您可以用途:
也就是说,您可以实现
valueOf
并让它返回age
。valueOf
* 不 * 作为>
的一部分在对象之间被调用:或者在自ES 2015在未过时的浏览器中得到普遍支持以来编写的代码中:
示例:
请注意,
p1 == p2
和p1 === p2
将始终为false
,即使age
相同:valueOf
在JavaScript引擎需要将对象转换为原语时被调用;对于==
或===
,它不会这样做,除非因为另一个操作数是原语,所以必须定义equals
并显式调用它(p1.equals(p2)
),或者强制比较原语(+p1 === +p2
),这很容易出错。pqwbnv8z2#
回顾这个问题并使用node v18.13.0,我发现对象之间的关系运算符调用
valueOf
方法,如果不可用,则调用toString
方法。可以构建String
表示以允许比较大多数对象类型(假设您可以根据需要构建String表示)。下面的示例通过注解进/出
toString
或valueOf
方法的两个版本来说明所有这些情况: