为什么在第一种情况下,相等运算符返回false?
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
为什么?
答案 0 :(得分:28)
由于日期是内置对象,而不是primitives,因此使用对象引用完成相等性检查。
在这种情况下,对象a
和b
不是同一个对象,因此测试失败。
您可以使用
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
方法 - 因此它是两个被比较的基元。
答案 1 :(得分:0)
答案 2 :(得分:0)
如果您创建两个时钟,并将它们设置为同一时间,则有两个时钟。
如果您在一个时钟中更改时间,则不会更改另一个时钟的时间。
比较或排序日期,从另一个中减去一个。 在数学表达式中使用的Date对象的值是其时间戳。
function compareDates(a,b){return a-b};
答案 3 :(得分:-1)
我很抱歉,但这很愚蠢......特别是关于两个时钟的问题。
==,根据定义比较VALUES,而===比较参考。对于非原语来说==失败会破坏语言自己的语法结构。当然,===在初始示例中会失败,因为两个日期显然是指向两个不同内存空间的两个不同指针,但是,根据JS规范的定义,==应返回TRUE以进行两个比较价值相同的日期。
我讨厌JS的另一个原因......
很抱歉咆哮,但这只是把我的屁股踢了一个小时。
顺便说一下,你可以使用valueOf()强制比较值,这将返回true ...它是多余的==但是它有效。