资讯专栏INFORMATION COLUMN

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

My_Oh_My / 2132人阅读

摘要:有两个可以表示空的值,分别是和,比较有作用的是前者。访问声明但未初始化的变量。有返回值时函数的表达式没有显式的返回任何内容。然而,为了比较其他变量和值,我们需要提前取得的值。因此,从标准实行后,全局变量已经是不再可写。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78095.html

相关文章

  • 细说 Javascript 遗篇(三) : 自动插入分号

    摘要:此时会自动插入分号,解析器将再次尝试。工作原理下面的代码没有分号,因此解析器将会自己判断在哪些地方插入分号。前置小括号在有前置小括号的情形时,解析器将不会自动插入分号。这不仅将保证代码整体的一致性,也将有效地避免解析器对代码行为的错误改变。 尽管 Javascript 有类似 C 的句法风格,但是它并不强制在代码中使用分号,所以分号可能被省略。Javascript 并不是一个缺少分号的...

    mushang 评论0 收藏0
  • 细说 Javascript 遗篇(四) : setTimeout setInterval

    摘要:当间隔时间设置较小时,将会导致回调函数堆积。处理可能阻塞的代码最简单且最可控的方式就是在回调函数内部使用函数。但是很明显,由于指定最大值的限制,还会有定时器没有被清除掉。另外,尽量避免使用函数,从而避免可能导致的回调函数堆积现象。 由于 Javascript 是异步的,因此我们可以通过 setTimeout 和 setInterval 函数来指定特定时间执行代码。 function ...

    wangjuntytl 评论0 收藏0
  • 细说 Javascript 遗篇(一) : 远离 eval 函数

    摘要:然而,函数只有在当前作用域中直接被调用并且被调用的函数名为才会被执行。在全局作用域下,这个字符串会一直被执行,在这个情形下我们并没有直接调用函数,也可以执行字符串。总结函数应该尽可能地避免使用。 Javascript 的 eval 函数可以在当前作用域执行一段包含 Javascript 代码的字符串。 var foo = 1; function test() { var fo...

    imtianx 评论0 收藏0
  • 细说 Javascript 类型篇() : typeof 操作符

    摘要:操作符还有可能是设计中最大缺陷,因为它几乎是完全破损的。由于用法与调用函数的语法相似,因此常被误以为是函数调用,实际上并不存在名为的函数,只是一个操作符而已。而列则表示对象内部的属性。属性文档中明确地给出了获得属性的途径,就是使用。 typeof 操作符(还有 instanceof)可能是 Javascript 设计中最大缺陷,因为它几乎是完全破损的。由于 typeof 用法与调用函数...

    PAMPANG 评论0 收藏0
  • 细说 Javascript 对象篇() : 原型对象

    摘要:并没有类继承模型,而是使用原型对象进行原型式继承。我们举例说明原型链查找机制当访问一个对象的属性时,会从对象本身开始往上遍历整个原型链,直到找到对应属性为止。原始类型有以下五种型。此外,试图查找一个不存在属性时将会遍历整个原型链。 Javascript 并没有类继承模型,而是使用原型对象 prototype 进行原型式继承。 尽管人们经常将此看做是 Javascript 的一个缺点,然...

    lansheng228 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<