译者:王二狗
我写博客主要用来整理我还不懂的知识,那些我精通的东西,往往没有动力写。炫耀从来不是我的动机,好奇才是。—— 阮一峰
当在日常的编程工作中使用日期时,程序员最常见的需求之一是检查一个日期是否与另一个日期相匹配。
大多数的程序员都会用下面这种方式来处理日期:
function isChristmas (dateToTest) {
var christmas = new Date("12/25/2014");
return (dateToTest === christmas);
}
不幸的是,这个函数将始终返回false。
console.log(isChristmas(new Date("12/25/2014")));
// => false
之所示始终返回false是因为,两个对象要做到相等,仅仅值相等时无法判定相等的,必须要值和引用都相同,才能做到两个对象都相等。
下面我们来修改一下我们的代码:
function isChristmas (dateToTest) {
var christmas = new Date("12/25/2014");
return (dateToTest.getTime() === christmas.getTime());
}
经过这种方式处理之后,我们就可以得到正确的结果:
console.log(isChristmas(new Date("12/25/2014")));
// => true
但是当我们比较一个在同一天但是不同时间的日期对象时,我们又会遇到一个新的问题:
console.log(isChristmas(new Date("12/25/2014 12:00")));
// => false
遇到这种情况我们采取的处理措施是仅仅对年份、月份和日期进行检查:
function isChristmas (dateToTest) {
return (dateToTest.getFullYear() === 2014) &&
// getMonth is 0-indexed
(dateToTest.getMonth() === 11) &&
(dateToTest.getDate() == 25);
}
console.log(isChristmas(new Date("12/25/2014 12:00")));
// => true
尽管这个函数现在可以工作了,但是还是存在许多的弊端,比如没有考虑时区的复杂性。
所以我们通常倾向于依赖像Moment.js这样的健壮且测试良好的库来进行日期比较之类的事情。
但最重要的是,你现在知道了比较日期不要使用JS的相等运算符。
告诫自己,即使再累也不要忘记学习,成功没有捷径可走,只有一步接着一步走下去。 共勉!