2010-05-22 221 views
11

为什么等号运算符在第一种情况下返回false?JavaScript日期比较

var a = new Date(2010, 10, 10); 
var b = new Date(2010, 10, 10); 
alert(a == b); // <- returns false 
alert(a.getTime() == b.getTime()); // returns true 

为什么?

回答

28

由于日期的内置对象,而不是primitives,则使用对象引用完成相等性检查。

在这种情况下,对象ab不是同一个对象,因此测试失败。
可以使用

var a = new String("a"); 
var b = new String("a"); 
alert(a == b); //false 

通过使用.getTime.valueOf你的对象值转换为原始看到相同的,而这些始终由价值,而不是按引用进行比较。

如果你想通过两个日期的价值做比较也有一个比较模糊的方式来做到这一点

var a = new Date(2010, 10, 10); 
var b = new Date(2010, 10, 10); 

alert(+a == +b); //true 

在这种情况下,一元+运营商强制JavaScript引擎调用对象valueOf方法 - 所以这是两个正在比较的基元。

+0

这是一个有趣的黑客,谢谢! – Art 2010-05-23 01:40:32

+0

不确定我真的称它为黑客。 – 2010-05-23 13:25:31

+0

只是为了确保 - 我指的是“+ a == + b”声明。 – Art 2010-05-31 04:36:56

0

Compare two dates with JavaScript

dates.compare(A,B)

事实是,两个对象之间的比较不能正常工作:/

+0

不是。两个对象之间的比较按指定进行。 – 2010-05-22 18:53:00

0

如果您创建两个时钟,并将它们都设置为同一时间,那么您有两个时钟。

如果您改变一个时钟的时间,它不会改变另一个时钟的时间。

要比较或排序日期,从一个减去另一个。 在数学表达式中使用的Date对象的值是其时间戳。

function compareDates(a,b){return a-b};

-1

我很抱歉,但这是愚蠢的...尤其是有两个钟。

==,按定义比较VALUES,而===比较参考。说==对于非原语失败会破坏语言自己的语法结构。当然,===在最初的例子中会失败,因为这两个日期显然是指向两个不同的内存空间的两个不同的指针,但是通过JS规范的定义,==应该返回TRUE来比较两个日期的价值是相同的时间点。

还有一个原因,我恨JS ...

对不起咆哮,但这只是踢我的屁股了一个小时。另外,你可以使用valueOf()来强制比较这些值,这将返回true ...它与==是多余的,但它的工作原理。

+0

同意之前检查每个日期的空值,这样的WTF – Art 2010-11-13 03:33:20

+1

您不知道您在咆哮什么... ==和===之间的区别==与value和refs没有关系,==简单地说,当两个操作数是不同类型时,VM应该使用一组明确定义的强制规则,而===则表示不会出现这种强制。 – 2011-05-19 10:19:48