方法一:
判断类型时,最最容易想到的就是typeof,但是如果通过typeof来判断是否为number类型,如果被判断的是NaN返回的结果也会是number,因此我们还需要用isNaN来排除NaN的情况。
1 | function isNumber (obj) { |
此外isNaN()相比Number.isNaN()会把被判断的参数强制转换成数字再进行判断,而Number.isNaN()只有在参数是真正的数字类型,且值为NaN时才会返回true。
1 | Number.isNaN(NaN) // true |
方法二:
isNaN(obj) 等价于isFinite()。Infinity在js表示数字的无穷大,判断是否可用做数字的最佳方法则是isFinite(),因为该方法会筛除掉NaN和Infinity两个关键字。
1 | function isNumber (obj) { |
同样的, Number.isFinite()方法用来检测传入的参数是否是一个有穷数(finite number)。 和全局的 isFinite() 函数相比,这个方法不会强制将一个非数值的参数转换成数值,这就意味着,只有数值类型的值,且是有穷的(finite),才返回 true。
1 | Number.isFinite(Infinity) // false |
方法三:
用Object.prototype.toString来实现,只是代码量要稍微大一点。
1 | function isNumber (obj) { |
或者
1 | function isNumber (obj) { |
多扯一点,toString()方法返回一个表示该对象的字符串。默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString()返回 “[object type]” ,其中type是对象的类型。
但是,待检测对象也许会重写toString()方法,这时就无法检测toString来判断类型。所以要保证能够检测类型,需要调用Object.prototype.toString来进行判断。如下:
1 | let X = function (x) { |
但是返回的” [ object, Type]” 不太好分辨,可以进行特殊的处理,直接返回类型名称。
1 | // 获取类型 |
这样就可以便捷的获取到类型名称了。
这里有提到了原型链,可以参看一篇写的很通熟易懂的博文,放上链接原型链。
方法四:
据说这个方法是世界上最短的数字判断代码。
1 | function isNumber (obj) { |
下面是通过该方法进行的延伸。
1、判断字符串 :
1 | function isString (obj) { |
2、判断布尔类型:
1 | function isBoolean (obj) { |
方法五:
用正则来实现,这也是我们最常用的方式。
1 | function isNumber (obj) { |
一个正在成长的前端小白~