Js中有两个表示“没有”这一概念的基本类型分别是null和undefined,那么他们有什么区别呢?
一、历史原因:null是对象,自动转化成0. undefined是原始值,自动转化成NaN。
在js语言初期阶段,js是效仿的java语言,在java中null也是一个对象,只不过这个对象表示的是空对象,换句话说,如果一个变量赋值为null,那么这个变量的指针不指向任何对象。这也说明为什么在js中用typeof检测null类型为“object”。同时还集成了java一个特点是null可以自动转化为0.
Js语言创造者发现,null表示空并不是很好,因为他毕竟是一个对象。同时,js语法中变量分为了原始类型和对象类型,所以要找到一个更好的方式来表示“空”这个概念。还有一个理由就是java中有错误处理机制,对于null自动转化成0的错误可以发现,但早期的js没有错误处理。
从而引入了undefined,undefined是一个原始值,不是对象,并且自动转化成NaN可以发现异常,用typeof检测undefined结果为“undefined”。
二、目前来看:null表示开发者已经明确确定此处确实没有东西,或者说这个变量没有指向任何的东西,是肯定的意料之中的。Undefined是指缺省值,此处肯定要有一个值,只不过你没有告诉我这个值是啥。
在一个幼儿园,老师要根据名单给孩子分礼物,1号孩子得到三个礼物,2号孩子在名单上表明没有礼物即0个礼物,3号孩子在名单上也没有说明他到底获得几个礼物,4号孩子获得一个礼物。
开始分发礼物,1号孩子获得了一个盒子里面放着三个星星,4号孩子获得了一个盒子里面放着一个星星,但是问题来了到底给不给2号孩子东西,如果不给,那么他将和3号孩子区分不出来,所以决定给他一个空盒子确定2号孩子没有星星,所以由于3号孩子不知的几个星星可能是0个或者更多,所以决定什么也不给他。
这里的2号孩子相当于一个变量,获得空箱子相当于赋予一个null,只不过这个变量不指向任何东西,3号孩子什么也没有获得,但是以后可能会获得到很多的星星或者确定确实没有星星,至少现在我还不知道。相当于有这么一个变量,但是以后可能或得到值,所以现在还不能决定他。
三、用法
Null:肯定变量不能有值
(1)作为函数的参数,表示该函数的参数不是对象或者明确不能有值。
(2) 作为对象原型链的终点。
Undefined:该变量肯定要有一个值,但是不知道是什么。
(1)变量被声明了,但没有赋值时,就等于undefined。
(2)调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性或属性不存在,该属性的值为undefined。