使用equals和compareTo方法在Javascript中进行对象比较

use*_*058 4 javascript

我正在尝试使用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.
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 6

JavaScript没有运算符重载,>也没有调用对象上的任何方法,所以不要p1 < p2使用你的equalscompareTo.

要进行这种比较,您需要使用:

document.writeln(p1.compareTo(p2) < 0);
Run Code Online (Sandbox Code Playgroud)

也就是说,你可以实现valueOf并让它返回age.valueOf 确实被称为>对象之间的一部分.

var Person = function() {
  this.age = null;
  this.name = null;
};

Person.prototype.valueOf = function() {
  return this.age;
};

var p1 = new Person();
var p2 = new Person();

p1.age = 10;
p2.age = 20;

snippet.log("p1 < p2: " + (p1 < p2)); // true
snippet.log("p1 > p2: " + (p1 > p2)); // false
Run Code Online (Sandbox Code Playgroud)
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
Run Code Online (Sandbox Code Playgroud)

当心,虽然,p1 == p2而且p1 === p2 将永远是false.valueOf当JavaScript引擎需要将对象转换为基元时调用; 它没有做到这一点的==或者===,除非它有因为其他操作数是原始的.所以你必须定义equals并显式调用它(p1.equals(p2)),或强制比较在基元(+p1 === +p2)之间,这很容易出错.