本文分析在IE浏览器中使用new Date()解析日期字符串时,调试器显示为NaN但实际返回对象的现象。通过测试发现,该对象虽包含NaN属性,但其本身仍为Object类型,非真正的NaN值。文章解释了IE调试器显示差异的原因及getFullYear等方法返回NaN的机制,帮助开发者理解这一兼容性细节。
IE浏览器下new Date()返回NaN的成因与对象特性分析
这里讨论的NaN并非真正的NaN值。
相关程序代码展示如下:
具体代码实现为:
var date = new Date(d);
if (!date || !date.getFullYear) {
return;
}
return S.Date.format(d, 'yyyy-mm-dd'); // 格式化函数,与本文主题无关 该代码在其他主流浏览器中运行正常,但在IE浏览器中会触发报错。
通过IE调试器观察,发现变量date显示为NaN,具体表现如图:

如果date确实是NaN,那么if判断条件应返回true并执行return空字符串,但实际出现了反常情况。

代码逻辑显示if判断返回了false,控制台输出结果也证实了这一点:
从结果可以看出date等于NaN,但!date却为false,而!NaN理论上应为true。起初怀疑这是IE下JavaScript的Bug,随后进行了进一步测试。
测试代码如下:
var date = NaN;
alert(!date) // 返回true
var date = new Date('2011-1-1');
alert(!date) // 返回false 经过思考,觉得上述解释尚不充分,因此在控制台进行了更多测试:
这表明date对象拥有getFullYear方法,说明date确实是一个对象。

这也进一步证实,date是object类型而非NaN,这仅仅是IE调试器显示层面的问题。
date.getFullYear() 返回 NaN date.getDate() 返回 NaN 这些NaN才是真正的不合法数值。 总结: 在IE浏览器中,执行 new Date('date text') 时返回的是一个特殊的日期对象,只是IE调试器将其显示为NaN。对该对象调用返回number类型的方法时,均会返回NaN。