JavaScript的数据类型大致分为两类:原始类型和对象类型。其中,原始类型包括数字、字符串和布尔值。此外,JavaScript中还有两个特殊的原始值:null(空)和undefined(未定义),它们不是数字、字符串和布尔值,它们一般分别表明各自特殊类型中惟一的成员。数组
null函数
null是JavaScript语言的关键字,它表示一个特殊值,经常使用来描述“空值”。对null执行typeof预算,结果返回字符串“object"(以下图),因此说,也能够将null认为是一个特殊的对象值,它的含义是“非对象”。但实际上,一般认为null是它自有类型的惟一的一个成员,它能够表示数字、字符串、对象是“无值”的。spa
typeof(null); // object
undefined3d
undefined也能够用来表示值的空缺。它和null不同,它不是关键字,它是变量的一种取值,代表变量没有初始化,在查询对象的属性或数组元素的值时返回undefined,则说明这个属性或元素不存在。若是函数没有返回任何值,则返回undefined。引用没有提供实参的函数形参的值也只会获得undefined。undefined是预约义的全局变量,它的值就是“未定义”。对象
null和undefined相同之处blog
null和undefined都是彻底不可变的值,都没有属性和方法,也不能给它们添加属性或者赋值(由于它们根本没有属性)。若是试图定义一个属性将会引起一个类型错误(以下图),它们是彻底无效的值。ip
在JavaScript中,“没有值”表明的布尔值是false,这意味着他们在条件上下文中会被被计算为false,如if语句中。内存
注意:使用相等操做符( == )比较这两个值和其余false值是不相等的,若是比较它们两个是相等的,可是不全等(===),由于类型不同。字符串
疑问:既然null和undefined在if判断语句中都表示为false,为何不能和false值相等呢?class
用等于(==)操做符将false对象和其余对象进行比较的时候,会发现,只有0和空字符串等于false;undefined和null对象并不等于false对象,而null和undefined是相等的。因此,能够把0、空字符串和false归为一类,称为“假值”;把null和undefined归为一类,称为"空值"。(我的理解:也就是说在JavaScript中,假值和空值都有一个共性,那就是在做为if的条件分支时,均被视为false ;应用"!"操做以后获得的均为true )
举例说明一下:
if语句中,null举例说明
if语句中,undefined举例说明
null和undefined区别
null和undefined基本是同义的,只有一些细微的差异。
一、null是一个表示“没有”的对象,转为数值时为0;undefined是一个表示"未定义"的原始值,转为数值时为NaN。
2、null表示“没有对象”,即该处不该该有值。undefined表示"缺乏值",就是此处应该有一个值,可是尚未定义。
3、null和undefined经过typeof判断出的结果不同。
备注:有资料显示,typeof的这种行为已经被确认为一个错误,虽然提出了修正,出于后兼容的目的,这一点已经保持不变。
扩展:
在ECMAScript 3中,undefined是可读/写的变量,能够给它赋任意值。这个错误在ECMAScript 5中作了修正,undefined在该版本中是只读的。
null常常被用于显式地指定变量为无效(object= null)当一个引用再也不是必需的,经过分配null值,有效地清除引用,并假设对象没有引用其余代码,指定垃圾收集,确保回收内存。有时也会在定义变量时,初始化为null;
undefined不多或者说不建议用在任何地方,undefined常常会出如今许多的方法代码中。一般遇到当试图访问一个不存在的值时,只会默认返回一个undefined值,而不是上升为一个错误。 任何声明变量时没有提供一个初始值,都会有一个为undefined的默认值。
总结:能够把undefined认为是表示系统级的、出乎意料的、或者是相似错误的值的空缺,而null是表示程序级的、正常的或在乎料之中的值的空缺。若是想把它们赋值给变量或者属性,或将它们做为参数传人函数,最佳选择是使用null。