首页 > 代码库 > 聊一聊js中的null、undefined与NaN
聊一聊js中的null、undefined与NaN
零、寒暄
翻翻自己的博客,上一篇竟然是六月26号的,说好的更新呢?回顾刚刚过去的这个七月,整天都是公司的入职培训加上自己的小论文,每天奋战到凌晨1点多,这是要挂的节奏啊!但是不论怎么说,自己的时间管理还是出了问题,以后一定要好好的规划一下,不多说,来正题!
自己为什么要写这篇文章呢?因为在吃完早饭,消化的时候,整了几行代码,然后发现整挂了。。。
大致代码如下:
function getByClass(clsName, parent){ if(parent=="undefined"){ var oParent=document; }else{ var oParent=document.getElementById(parent); } //后面代码略去}
上面的方法在判断第二个可选参数的时候,如果没有传参,我要处理一下,然后程序在这里卡住了。最后换成undefined关键字就可以了,这里就要涉及到undefined和null的一些用法,具体不同的地方,请接着往下看。
一、null、undefined与NaN的概念
1.在js中,我一直觉得undefined和null的区别不大,平时用的时候也不会太在意。总体说来:
undefined一般表示根本”不存在“,null表示定义了,但是值是”空“。
但是大家发现,在 Java等编译型语言中,并不存在 undefined。这是为什么呢?Java 是一个静态类型语言,所有的变量在初始化时都进行了严格的类型声明,如果你定义一个undefined的变量,恐怕在编译的时候就被咔擦掉了,但是java中是允许定义null来表示空值的。而 JavaScript 是一门动态解释性语言,对于不存在的类型,只有在运行解释的时候才会作出判断。
2.什么情况下会是null?
//(1)给一个变量或者对象赋值的时候,赋值null,此处不宜赋值为undefinedvar parm=null; //(2)当元素获取不到时,dom返回的也是nullvar dom = document.getElementById(‘domId‘);//null//(3)另外原型链的终点,也是返回null的Object.getPrototypeOf(Object.prototype)//null
3.什么情况下使用undefined呢?
主要有一下几种情况:
(1)声明变量,但未赋值
(2) 函数无返回值,执行后返回undefined
(3) 函数中可选参数,没有传参时返回undefined
(3)对象中不存在或未赋值的属性
看下面的实例代码:
var a;console.log(a)//undefinedvar foo=function(){}console.log(foo());//undefinedfunction getI(i){ console.log(i);}getI();//undefined var o={};
console.log(o.name);//undefined
4.下面看一下undefined和null转换为数值、typeof上面的表现
Number(undefined);//NaNNumber(null);//0typeof(undefined)//"undefined"typeof(null)//"object"
从上面可以看出,undefined转换为数值是NaN,而null可以转换为0,这是两者的区别;另外typeof检测之后,二者返回的分别是"undefined"、"object"
【注】typeof 返回的是字符串,有六种可能:"number"、"string"、"boolean"、"object"、"function"、"undefined",这个后续可以为二者的检测来服务。
5.NaN
一般来说,当运算无法返回正确的数值时,其返回“NaN”值。NaN 值“不是数字”,所以在比较大小的时候,是无法处理的,更要注意的是 NaN 本身也不等于 NaN 。我们可以用JavaScript的内建函数isNaN()来检测一个值是否是数值。
二、怎么判断undefined、null与数值
1.判断undefined:
var parm=undefined;if (typeof(parm) == "undefined"){ alert("i am undefined"); }
注意typeof是返回的字符串,需要把undefined也变成字符串比较
2.判断null:
var parm = null; if (!parm && typeof(parm )!="undefined" && parm !=0){ alert("i am null"); }
仅仅判断null,比较麻烦一些。首先将其转化为bool值判断,这里可能出现undefined、null与数值;然后利用typeof去筛选掉undefined;最后排除数值;
3.判断NaN:
var parm= 0/0; if(isNaN(parm)){ alert("i am NaN"); }
【注】isNaN() 函数可以用来检测一些运算过后可能出现的异常,比如0作除数等等,还有检测 parseFloat() 和 parseInt()处理以后的结果是否是数值,这样可以减少程序可能抛出的异常
4.同时判断undefined和null:
var parm= undefined; //var parm= null; if (parm== undefined) { alert("i am null or undefined"); }
由于一般来说null==undefined返回的是true,所以我们可以用上述的方法去检测。
5.同时判断undefined、null与数值:
var parm= null; //var parm= undefined;//var parm= 0;if (!parm) { alert("i am null or undefined or 0"); }
一般来说我们js判断中,不需要严格的检测时,直接!parm就可以了。
三、总结
总体来说,这是一个细节问题,但是对细节把握的越清楚,在实际的code过程中就不易出错。我是一枚前端菜鸟,希望这篇文章能对大家有所启发,文中有理解错误的地方,希望大家指正。如果各位基友和软妹子觉得文章对您有所帮助,你的留言和推荐将对我是莫大的鼓舞!各位,午安!