Write By Monkeyfly
以下内容均为原创,如需转载请注明出处。
前提
在上篇博文《JavaScript基础教程之函数的重新学习》中提到了isNaN()方法,但当时由于时间和篇幅原因,没有对此方法做详细说明。现在专门用一篇文章对该方法的用法进行解释说明。
定义
isNaN() 函数用于检查其参数是否是非数字值。它是JavaScript提供的一个内置函数。
语法
isNaN(x)
说明:
(1)isNaN() 函数通常用于检测 parseFloat() 和 parseInt() 的结果,以判断它们表示的是否是合法的数字。
(2)也可以用 isNaN() 函数来检测算数错误,比如用 0 作除数的情况。
(3)如果 参数 x 是特殊的非数字值 NaN(或者能被转换为这样的值),返回的值就是 true。而如果 x 是其他值,则返回 false。
(4)isNaN() 是全局函数,存在隐式的类型转换;
后来在学习的过程中,又发现这样一个函数,功能和isNaN() 类似。如下:
Number.isNaN(x)
ps:
- Number.isNaN() 方法确定传递的值是否为 NaN,并且它是 Number类型的。它是原始的全局isNaN()方法的更强大的版本。
- Number.isNaN() 方法的参数值必须是Number类型的才能进行判断(这是基础),否则返回的都是false。
测试过程如下:
var abc = "120px";
/*判断一个数是否是NaN值(非数值类型)*/
var temp = isNaN(parseInt(abc));
document.write("<br/>" + temp +"<br/>"); //false
/*当参数为数字时*/
document.write("<br/>" + "isNaN(0):" + isNaN(0) +"<br/>");//false
document.write("<br/>" + "Number.isNaN(0):" + Number.isNaN(0) + "<br/>");//false
document.write("<br/>");
document.write("<br/>" + "isNaN(123):" + isNaN(123) +"<br/>");//false
document.write("<br/>" + "Number.isNaN(123):" + Number.isNaN(123) + "<br/>");//false
document.write("<br/>");
document.write("<br/>" + "isNaN(-12.3):" + isNaN(-12.3) +"<br/>");//false
document.write("<br/>" + "Number.isNaN(-12.3):" + Number.isNaN(-12.3) + "<br/>");//false
document.write("<br/>");
document.write("<br/>" + "isNaN(3.1415):" + isNaN(3.1415) +"<br/>");//false
document.write("<br/>" + "Number.isNaN(3.1415):" + Number.isNaN(3.1415) +"<br/>");//false
document.write("<br/>");
/*22除以0系统判定为无穷大,不属于NaN,肯定返回false*/
document.write("<br/>" + "isNaN(22/0):" + isNaN(22/0) +"<br/>");//false
document.write("<br/>" + "Number.isNaN(22/0):" + Number.isNaN(22/0) +"<br/>");//false
document.write("<br/>");
/*而0除以0系统判定NaN,肯定返回true*/
document.write("<br/>" + "isNaN(0/0):" + isNaN(0/0) +"<br/>");//true
document.write("<br/>" + "Number.isNaN(0/0):" + Number.isNaN(0/0) +"<br/>");//true
document.write("<br/>");
/*当参数为数字型字符串时*/
document.write("<br/>" + "isNaN(\"123456\"):" + isNaN("123456") +"<br/>");//false
document.write("<br/>" + "Number.isNaN(\"123456\"):" + Number.isNaN("123456") +"<br/>");//false
document.write("<br/>");
/*当参数为纯字符字符串时*/
document.write("<br/>" + "isNaN(\"lala\"):" + isNaN("lala") +"<br/>");//true
document.write("<br/>" + "Number.isNaN(\"lala\"):" + Number.isNaN("lala") +"<br/>");//false
document.write("<br/>");
/*当参数为字符串“NaN”时*/
document.write("<br/>" + "isNaN(\"NaN\"):" + isNaN("NaN") +"<br/>");//true
/*Number.isNaN()方法中,字符串 "NaN" 不会被隐式转换成数字 NaN。*/
document.write("<br/>" + "Number.isNaN(\"NaN\"):" + Number.isNaN("NaN") +"<br/>");//false
document.write("<br/>");
/*当参数为NaN时*/
document.write("<br/>" + "isNaN(NaN):" + isNaN(NaN) +"<br/>");//true
document.write("<br/>" + "Number.isNaN(NaN):" + Number.isNaN(NaN) +"<br/>");//true
document.write("<br/>");
经测试发现:
1.isNaN()函数会尝试将参数值先用Number()进行转换,即先将字符串转换为数字然后才判断结果。
转换后的结果如果为“非数值”则返回true,转换后发现还是数值则返回false。
2.
console.log(0/0) NaN 非数值型
console.log(22/0) Infinity <数>无穷大
所以,
isNaN(0/0); //true
isNaN(22/0); //false
22除以0系统判定为无穷大,不属于NaN,肯定返回false。而0除以0系统判定NaN,肯定返回true。
3.
typeof "NaN" "string"
typeof NaN "number"
4.
console.log(NaN) NaN(输出前判断了它的类型为NaN)
console.log("NaN") NaN(字符串原样输出)
console.log(123) 123(数字也会原样输出)
//系统会认为它们是变量,没有定义,连声明也没有,直接报错
console.log(num123) //Uncaught ReferenceError:num123 is not defined
console.log(number) //Uncaught ReferenceError:number is not defined
此时,又引出另外一个问题【变量的定义和声明的区别】
在JavaScript中:
var a; //这就是声明了变量。但是未定义!【定义就意味着要给变量赋值。】
var a = 123; //这就是定义了变量。【声明了并且赋值了,就是定义】
举例:
var abc;
console.log(abc); /*undefined*/
console.log(adc); /*Uncaught ReferenceError:adc is not defined*/
说明:
ReferenceError(引用错误) 对象表明一个不存在的变量被引用。
必须知道:
- 在js中使用一个变量,一般是先声明变量,然后给它赋值。
- 而且所有的变量都是由var声明的。
- 在这点上,JavaScript跟C、Java是不同的。
举例:
//不使用var定义变量:
function abc(){
console.log(s);
s = "hello world";
}
abc(); //直接报错,s变量根本就不存在,Uncaught ReferenceError:s is not defined
---------------------------------------------------------
//使用var定义变量:
function abcd(){
console.log(c);
var c = "hello world";
}
abcd();//不会报错,显示undefined,意思是变量c使用var关键字声明了但是没有定义
---------------------------------------------------------
结论:使用var 定义变量,会让变量的声明提前。
举例:
var a = 'hello World';
function bc(){
var a = 'hello Fly';
console.log(a);
}
bc() //'hello Fly'
console.log(a); //'hello world'
var a = 'hello World';
function bc(){
a = 'hello Fly';
console.log(a);
}
bc() //'hello Fly'
console.log(a); //'hello Fly'
结论:在函数作用域内,使用var定义的变量是局部变量,不使用var定义的就成了全局变量。
注意:
- NaN是非常特殊的值,它不和任何类型的值相等,包括它自己。
- 同时它与任何类型的值比较大小时都返回false。
分析:
Number.isNaN(参数)
- 首先,参数必须是number型(数值型)
像这种的通通不行:0;”123”;”str”;true;false;”“;” “;”NaN”等 - 如果值为非数值(NaN值),返回true。【比如:0/0、NaN】
- 如果值为其他,返回false。
问题:
//这为什么也会输出true呢?
console.log(Number(0) == ""); //true
答案:
//在进行比较时会进行隐式类型转换,空字符串会被自动转换成 0
即console.log(Number(0) == 0); //自然返回为true。
但是,
console.log(Number(0) === 0); //这还是输出true
console.log(Number(0) === ""); //false,因为不进行类型转换那就不会相等了
结束语
以上内容,就是自己对isNaN()方法的理解和学习,如果存在问题,欢迎大家批评指正。目前就总结了这么多,有可能日后还会继续完善,希望可以对初学JavaScript的同学有所帮助。(ps:我也是一个初学者)