undefined、null和NaN都属于javascript中的数据类型。
undefined
undefined类型只有一个值,即特殊的undefined。在使用var生命变量但未对其加以初始化是,这个变量的值就是undefined,例如
var message;
alert(messag==undefined);// true
这个例子只声明了变量message,但未对其初始化。比较这个变量与undefined字面量,结果表明他们是相等的。
不过包含undefined值的变量与尚未定义的变量还是不一样的。
比如:
var message // 这个变量声明之后默认取得了undefined值
//下面这个变量并没有声明
//var age
alert(message)// undefined
alert(age) // 产生错误
但是有趣的是:
对未初始化的变量执行typeof操作符会返回undefined值,而对未声明的变量执行typeof操作夫同样也会返回undefined值,来看下面的列子:
var message;//这个变量声明之后取得了undefined值
//下面这个变量并没有声明
//var age
alert(typeof message);// undefined
alert(typeof age) ; // undefined
结果表明,对未初始化和未声明的变量执行typeof操作都返回了undefined值:这个结果有其逻辑上的合理性。
Null类型
Null雷响是第二个只有一个值的数据类型,这个值就是null,从逻辑角度来看,null值表示一个空对象指针,而这也是使用typeof操作符检测null值会返回object的原因。如下:
var car=null;
alert(typeof car) // object
如果定义的i按量准备在将来用于保存对象,那么最好将该变量初始化未null,而不是其他值。实际上,undefined值是派生null值的,因此ECMA-262规定对他们的想等新测试要返回true。
alert(null==undefined) //true
NaN
NaN,即非数字值,是一个特殊的数值,属于Number类型。这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。在ECMAScript中,任何数值除以非数值类型都会返回NaN,同时不会影响其他代码的执行。NaN本省有两个非同寻常的特点,首先,任何设计NaN的操作都会返回NaN,这个特点在多步计算中有可能导致问题。其次,NaN与任何值都不相等,包括其本身。例如:
alert(NaN==NaN) ; // false
针对NaN的这两个特点,ECMAScript定义了isNaN()函数。这个函数接收了一个参数,该参数可以是任何类型,而函数会帮我们确定参数是否“不是数值”。isNaN()在接收到一个值后,会舱室将这个值转为数字。某些不是数值的值会直接转换为数值。而任何不能被转换为数值的值都会导致这个函数返回true。请看下面列子:
alert(isNaN(NaN)) ; //true
alert(isNaN(10)) ; //false(10是一个数值)
alert(isNaN(“10”)) ; //false(可以被转换为数值10)
alert(isNaN(“blue”)) ; //true(不能被转换为数值)
alert(isNaN(true)) ; //false(可以被转换为数值1)
其次:
isNaN也适用于对象,在基于对象调用isNaN函数是,会首先调用对象的valuof()方法,然后确定该方法返回的值是否可以转换为数值,如果不能,则基于这个返回值在调用toString()方法,再测试返回值。而这个过程也是ECMAScript中内置函数和操作符的一般执行流程。