Javascript
有两个可以表示空的值,分别是 undefined
和 null
,比较有作用的是前者。
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
尽管在 Javascript
中 undefined
类型变量的使用类似于 null
,但是实际上是完全不同的另一种类型的变量。null
在 Javascript
中有一些使用场景(例如声明原型链的结束 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
已经是不再可写。
参考
http://bonsaiden.github.io/JavaScript-Garden/#core.undefined
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。