number
你认识的NaN?
思考了片刻,我先来说一下我的一些认知:
1. ECMAScript 1引入的
2. 全局对象的属性
3. 在高级浏览器是只读属性
4. 与任何值都不相等,包括自己
那如何判定参数是否是NaN?
有的同学应该会想到 isNaN
但是请看下面的代码:
isNaN(1); //false
isNaN("本内容来自w3cplus"); //true
isNaN("我是NaN Family,选我选我~"); //true 种了阿妹的毒
isNaN(NaN); //true
isNaN({}); //true
isNaN(undefined); //true
很多同学从上面的代码中也应该知道,全局的这个isNaN其实还有一些"副作用":
比如对参数为{}和undefined的也会返回true。 那么咋搞呢?
isNaN 与 Number.isNaN
isFinite 与 Number.isFinite
isInteger 与 Number.isInteger
Number.fn 的参数 typeof 为 number ,不具转参数的能力
isNaN ,isFinite , isInteger 可
var e = '1';
isInteger(e); 为true;
1. Number.isNaN
语法:
Number.isNaN(source);
我们再来看一下下面的示例:
Number.isNaN({}); //false
Number.isNaN(undefined); //false
Number.isNaN("本内容来自w3cplus"); //false
Number.isNaN(NaN); //true
Number.isNaN(0/0); //true
来自官方wiki的一个兼容版本:
//给一些低级浏览器
function isNaNfn(source){
return typeof source === 'number' && isNaN(source);
}
2. Number.isFinite
看到isFinite,应该有同学也会想起那个全局的isFinite,其实他们功能上都是判定指定参数是否是有限数值,那他们有啥区别呢?
我们来看一下示例代码:
isFinite(1); //true isFinite("1"); //true Number.isFinite(1); //true Number.isFinite("1"); //false
很直观地看出,isFinite会对参数进行“类型转换”,但是Number.isFinite不具备这种功能
3. Number.isInteger
这个函数可以直接来判定参数是否是整数,非常直观&方便
代码示例:
Number.isInteger(0); //true
Number.isInteger("10"); //false
Number.isInteger(0.1); //false
Number.isInteger(NaN); //false
Number.isInteger("a"); //false
说明:该方法也不会自动进行参数类型转换~
顺便送上一个官方wiki的解决方案:
//2的52+1次方是多少?
function isInteger(source){
return typeof source === 'number' && isFinite(source) && source > -9007199254740992 && source < 9007199254740992 && Math.floor(source) === source;
}
内容参考: