木森林林常识库

木森林林常识库
专业信息资源分享平台

JavaScript数据类型之Undefined类型

一、Undefined类型

Undefined类型只有一个值,即特殊的undefined值。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined,例如:

var message;
alert(message == undefined);  //true

这个例子只生命了变量message,但未对其进行初始化。比较这个变量与undefined字面量,结果表明它们是相等的。这个例子与下面的例子是等价的:

var message = undefined;
alert(message == undefined);  //true

这个例子使用undefined值显式初始化了变量message。但我们没有必要这么做,因为未经初始化的值默认就会取得undefined值。

一般而言,不存在需要显式地把一个变量设置为undefined值的情况。字面值undefined的主要目的是用于比较,而ECMA-262第3版之前的版本中并没有规定这个值。第3版引入这个值是为了正式区分空对象指针未经初始化的变量

二、未初始化的变量与尚未定义的变量

不过,未初始化的变量尚未定义的变量是不一样的,看看下面这个例子:

var message;
//var age;

alert(message);  //"undefined"
alert(age);  //产生错误

运行以上代码,第一个警告框会显示变量message的值,即“undefined”。而第二个警告框,由于传递给alert()函数的是尚未声明的变量age,则会导致抛出一个错误。对于尚未声明过的变量,只能执行一项操作,即使用typeof操作符检测其数据类型(对未经声明的变量调用delete不会导致错误,但这样做没什么实际意义,而且在严格模式下确实会导致错误)。

然而,令人困惑的是:对未经初始化的变量执行typeof操作符会返回undefined值,而对未声明的变量执行typeof操作符同样也会返回undefined值。来看下面的例子:

var message;
//var age

alert(typeof message);  //"undefined"
alert(typeof age);  //"undefined"

结果表明,对未经初始化和未声明的变量执行typeof操作符都返回了undefined值,这个结果有其逻辑上的合理性。因为虽然这两种变量从技术角度看有本质区别,但实际上无论对哪种变量也不可能执行真正的操作。

即便未初始化的变量会自动被赋予undefined值,但显示地初始化变量依然是明智的选择。如果能够做到这一点,那么当typeof操作符返回“undefined”值时,我们就知道被检测的变量还没有被声明,而不是尚未初始化。

分享:

评论