isNaN判断d3格式化时间字符串返回true的原因是什么
现象产生原因
全局isNaN()方法并不做严格的等值判断,它的执行逻辑存在隐式类型转换:
- 先尝试把传入的参数强制转换为数字类型
- 如果转换结果为
NaN,就直接返回true,不会校验参数本身的实际值和类型
你的代码里v是d3.timeFormat()返回的字符串类型值,内容为"06-19 12:20:30.200",这个格式的字符串在强制转数字时会得到NaN,因此全局isNaN()会返回true,和v本身是不是NaN没有关系。
你可以用普通字符串做验证:执行
isNaN("test")同样会返回true,但字符串"test"显然不是NaN。
正确的判断方案
- 如果你要严格判断一个值是否真的为
NaN,使用ES6提供的Number.isNaN(),该方法不会触发隐式类型转换,只有传入值本身就是NaN时才会返回true:Number.isNaN(v) // 传入字符串v时返回false,符合预期 - 如果你是要校验d3的时间解析是否成功,不需要判断格式化后的字符串:
d3.timeParse()解析失败时会直接返回null,判断解析得到的Date对象t是否为null即可。 - 也可以利用
NaN是JS中唯一不等于自身的特性做兼容判断:const isRealNaN = val => val !== val
内容的提问来源于stack exchange,提问作者lucky1928
相关产品推荐
相关产品推荐

