我正在尝试使用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)
JavaScript没有运算符重载,>也没有调用对象上的任何方法,所以不要p1 < p2使用你的equals或compareTo.
要进行这种比较,您需要使用:
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)); // falseRun 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)之间,这很容易出错.
| 归档时间: |
|
| 查看次数: |
3201 次 |
| 最近记录: |