为何JavaScript中日期对象值相等但===判断不成立?
Date对象用===判断不生效的原因
问题场景
以下是处理日期的JavaScript代码:
let startDate = new Date(toolOrder.jsAppStartDate.getTime()); // 克隆日期对象 startDate.setDate(startDate.getDate() - Math.floor((days - 1) / 2)); // 减去若干天 console.log(toolOrder.jsAppStartDate); // 输出: Date Thu Sep 21 2023 00:00:00 GMT+0200 (Central European Summer Time) console.log(toolOrder.jsAppStartDate.getTime()); // 输出: 1695247200000 console.log("--------------"); for (let index = 0; index < days; index++) { console.log(startDate); console.log(startDate.getTime()); // ... 绘图代码 ... startDate.setDate(startDate.getDate() + 1); // 增加一天 if(startDate === toolOrder.jsAppStartDate) // 判断是否到达起始日期 { console.log("Dates match"); startDate = new Date(toolOrder.jsAppEndDate.getTime()); } }
循环前日志输出:
Date Thu Sep 21 2023 00:00:00 GMT+0200 (Central European Summer Time) 1695247200000 ---------------
循环日志输出:
Date Mon Sep 18 2023 00:00:00 GMT+0200 (Central European Summer Time) 1694988000000 Date Tue Sep 19 2023 00:00:00 GMT+0200 (Central European Summer Time) 1695074400000 Date Wed Sep 20 2023 00:00:00 GMT+0200 (Central European Summer Time) 1695160800000 Date Thu Sep 21 2023 00:00:00 GMT+0200 (Central European Summer Time) 1695247200000 Date Fri Sep 22 2023 00:00:00 GMT+0200 (Central European Summer Time) 1695333600000
可见循环第3次时两个日期的时间戳完全匹配,但if(startDate === toolOrder.jsAppStartDate)条件不生效;改用if(startDate.getTime() === toolOrder.jsAppStartDate.getTime())则正常触发。
核心原因
引用类型与原始类型的区别
JavaScript里Date属于引用类型,而getTime()返回的是原始数值类型(毫秒级时间戳)。严格相等运算符
===的判断逻辑- 对于引用类型,
===比较的是对象在内存中的引用地址:只有当两个变量指向同一个对象实例时,才会返回true。 - 对于原始类型,
===比较的是值本身:只要值相等,就返回true。
- 对于引用类型,
结合代码分析
你通过new Date(toolOrder.jsAppStartDate.getTime())克隆出了startDate,它是一个全新的Date实例,和toolOrder.jsAppStartDate在内存中是两个独立的对象——哪怕两者的时间值完全一致,它们的引用地址也不相同,所以startDate === toolOrder.jsAppStartDate必然返回false。
而调用getTime()后,两者返回的都是数值类型的时间戳,只要数值相等,===就会返回true,条件也就正常生效了。
内容的提问来源于stack exchange,提问作者Thallius
相关产品推荐
相关产品推荐

