在Underscore.js库中,有一个名为isFinite
的函数返回' true'如果值是数字。考虑到Javascript的内置函数isFinite
已经返回' true'如果作为参数传递的值是一个数字,为什么我们还需要调用!isNaN(parseFloat(obj))
?
// Is a given object a finite number?
_.isFinite = function(obj) {
return isFinite(obj) && !isNaN(parseFloat(obj));
};
答案 0 :(得分:4)
这涵盖了isFinite("")
,isFinite(null)
和isFinite(false)
全部返回true
的情况,因为isFinite
盲目地将其参数转换为数字并对待任何这些就像0
。
从数字转换开始...
Number("") // 0
Number(false) // 0
Number(null) // 0
Number(undefined) // NaN
... isFinite
有一些令人惊讶的结果:
isFinite("") // true
isFinite(false) // true
isFinite(null) // true
isFinite(undefined) // false
同时,_.isFinite
会返回更像您预期的内容,因为parseFloat
会为所有这些值返回NaN
_.isFinite("") // false
_.isFinite(false) // false
_.isFinite(null) // false
_.isFinite(undefined) // false
请注意,您可以使用Number.isFinite
进行相同的显式检查,Number.isFinite("") // false
Number.isFinite(false) // false
Number.isFinite(null) // false
Number.isFinite(undefined) // false
不会尝试转换其参数(但在浏览器中支持不太好):
{{1}}