乐者为王

Do one thing, and do it well.

JavaScript中的undefined

JavaScript有6种类型,undefined、null、boolean、number、string和object。其中,null类型只有一个值null。undefined类型也只有一个值,即undefined,当声明的变量没有被赋值的时候,该变量的默认值就是undefined。

1
var foo;

上面这行代码声明了变量foo,没有赋值。脚本引擎在处理代码的时候会给该变量赋予值undefined。实际上,该行代码等价于

1
var foo = undefined;

可以用下面的代码测试:

1
2
3
4
var foo;
alert(foo == undefined);    // true
alert(foo === undefined);    // true
alert(typeof(foo));    // undefined

JavaScript另一个有趣的方面是在使用变量之前不必声明。例如:

1
2
3
var foo = "Hello ";
bar = foo + "world!";
alert(bar);    // Hello world!

变量bar并没有用var运算符定义,这里只是使用了它,就像已经声明过它一样。脚本引擎遇到未声明过的标识符时,用该变量名创建一个全局变量,并将其初始化为指定的值(这里是foo + "world")。这是该语言的便利之处,不过如果不能紧密跟踪变量,这样做也很危险。考虑下面的代码:

1
2
3
4
5
var foo;
// Make sure this variable isn't defined
//var bar;
alert(foo);
alert(bar);

执行的结果是:

undefined

undefined-error

alert(bar)出现错误是因为bar被创建成全局变量后没有被初始化,还处在未初始化(uninitialized)状态。但是,typeof运算符并不真正区分这两种值。考虑下面的代码:

1
2
3
4
5
var foo;
// Make sure this variable isn't defined
//var bar;
alert(typeof(foo));    // undefined
alert(typeof(bar));    // undefined

前面的代码对两个变量的输出都是“undefined”,即使变量bar在使用前没有被声明。

当函数无明确返回值时,返回的也是值undefined,如下所示:

1
2
3
function foobar() { }
alert(foobar() == undefined);    // true
alert(foobar() === undefined);    // true

ECMAScript认为undefined是从null派生出来的,所以把它们定义为相等的:

1
alert(null == undefined);    // true

尽管这两个值相等,但它们的含义不同。undefined是声明了变量但未赋值时赋予该变量的值,null则用于表示尚未存在的对象(但从技术上来说,null仍然是原始值)。如果要区分两者,要使用===或typeof运算符。

Comments