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


StephenLi
7k 声望488 粉丝

知不足。