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

时间:2015-07-28 14:25:18

标签: javascript

我正在尝试使用equals和compareTo方法实现自定义相等和关系操作。但是,我得到了错误的结果。请帮我弄清楚我在哪里做错了。

-(void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    //Fix for bug where spinner would overlap the text
    dispatch_async(dispatch_get_main_queue(), ^{
        [_refreshControl beginRefreshing];
        [_refreshControl endRefreshing];
    });
}

1 个答案:

答案 0 :(得分:6)

JavaScript没有运算符重载,>不会调用对象上的任何方法,因此p1 < p2不会使用您的equalscompareTo。< / p>

要进行比较,您可以使用:

document.writeln(p1.compareTo(p2) < 0);

也就是说,您可以实施valueOf并让它返回agevalueOf 在对象之间作为>的一部分进行调用。

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
<!-- 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>

谨防p1 == p2p1 === p2 始终为false 。当JavaScript引擎需要将对象转换为基元时,将调用valueOf;它不会对=====执行此操作,除非必须这样做,因为另一个操作数是基元。所以你必须定义equals并明确地调用它(p1.equals(p2)),或者强制比较在基元(+p1 === +p2)之间,这很容易出错。