细说 Javascript 拾遗篇(二) : undefined 和 null

1

Javascript 有两个可以表示空的值,分别是 undefinednull,比较有作用的是前者。

undefined

undefined 是一种值为 undefined 的变量类型。
Javascript 还定义了一个全局变量 undefined,它的值就是 undefined,然而这个变量既不是常量也不是 Javascript 的关键字。这就意味着这个变量的值可以被重新赋值。

请输入图片描述

下面总结下会返回 undefined 值的情况:

1.访问未曾修改的全局变量 undefined

请输入图片描述

2.访问声明但未初始化的变量。

请输入图片描述

3.没有定义 return 表达式的函数。

请输入图片描述

有返回值时:

请输入图片描述

4.函数的 return 表达式没有显式的返回任何内容。

请输入图片描述

5.访问不存在的属性。

请输入图片描述

6.函数参数没有被显式传递值。

请输入图片描述

7.赋值为 undefined 值的变量。

请输入图片描述

8.void(expression) 形式的表达式。

请输入图片描述

处理 undefined 值的变化

由于全局变量 undefined 只是保存了一份值为 undefined 的拷贝,因此修改该变量的值并不会改变 undefined 类型的值。
然而,为了比较其他变量和 undefined 值,我们需要提前取得 undefined 的值。
为了避免代码中可能对 undefined 变量进行重新赋值,常用的方法是使用一个额外的参数传递到匿名的立即执行函数中。

var undefined = 123;
(function(something, foo, undefined) {
    // undefined in the local scope does 
    // now again refer to the value `undefined`

})('Hello World', 42);

另外一种方法是在函数内部重新声明变量 undefined:

var undefined = 123;
(function(something, foo) {
    var undefined;
    ...

})('Hello World', 42);

null

尽管在 Javascriptundefined 类型变量的使用类似于 null,但是实际上是完全不同的另一种类型的变量。
nullJavascript 中有一些使用场景(例如声明原型链的结束 Foo.prototype = null),但是在绝大部分情况下,null 都可以被 undefined 所代替。

总结

尽管 undefined 不是关键字,可被赋值,但是根据现在的规范好像是并不可重写:

请输入图片描述

这个问题明日再研究下。

今天提问后解决了这个问题,原因在于 ECMAScript 5 标准里加入了变量拥有可写、可枚举、可配置属性。
而全局的 undefined 的可写属性是 false。测试如下:

Object.getOwnPropertyDescriptor(window, "undefined");

结果为:

Object {value: undefined, writable: false, enumerable: false, configurable: false}

所以当时作者写下这句话时应该是在 EMCAScript 5 标准制定之前。因此,从 EMCAScript 5 标准实行后,全局变量 undefined 已经是不再可写。

提问链接:《全局变量 undefined 可以被重写应该怎么理解》

参考

http://bonsaiden.github.io/JavaScript-Garden/#core.undefined

你可能感兴趣的

Dont · 2014年05月19日

总结那里,这个问题明日“在”研究下。:p
undefined好绕啊,列举了好多情况,感觉好难记,虽然感觉好几种情况其实都感觉可以归结在一个,就是看表达式是否有赋值或者return,没有就是undefined,所以console很多时候都在你回车的时候打印出undefined c
undefined 是一种值为 undefined 的变量类型。后一个undefined是字符串么?有点GNU is Not Unix的赶脚

回复

StephenLee 作者 · 2014年05月19日

哈哈,错字已更改,最后一个问题的答案当然是否定的,你可以测试一下:
var a = 'undefined'; a === undefined; a == undefined;
以上两个比较都会返回 false
首先 undefined 和字符串一样,是一种独立的变量类型。而且它所代表的含义是未定义,等同于空的含义,一定要进行比较的话,只能说跟 null 可以比较一下。
undefined == null 这个应该会返回 true

回复

载入中...