Underscore.js在isFinite函数之后调用isNaN

时间:2014-11-19 01:42:48

标签: javascript underscore.js

在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));
  };

1 个答案:

答案 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}}