isNaN()内置函数的用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tel13259437538/article/details/79006648

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:我也是一个初学者)

猜你喜欢

转载自blog.csdn.net/tel13259437538/article/details/79006648
今日推荐