代码改变世界

怎样写出更好的JavaScript程序之undefined篇(下)

2009-12-05 11:21  Nana's Lich  阅读(1516)  评论(2编辑  收藏  举报

 

这个系列终于到了最后一篇了,在前两篇之中我介绍了undefined这个概念的常见使用办法最方便有效的办法以及其它变种

这一篇主要的目的是总结几种常见办法的优势劣势、各自的适用情况,以及可能存在的误区。

 

为了直观表示,我不再作过多的描述,而是直接用表格把各种办法之间的差别列出:

这个表格中详细地比较了各种办法的优劣,如果你看不到就太可惜了

 而容易产生误解的细节中,我认为比较重要的是这些:

  1. null和undefined的不同意义:虽然一般的相等比较运算符会认为这两者是相等的,但实际上并不完全如此。
    从本质上说undefined是属于“什么也没有”的状态,这也是它唯一要表达、要强调的;而null其实是一个对象指针——这里的对象是包括JavaScript(此处的JavaScript指ECMAScript 3的实现,包括JScript)函数在内的宽泛定义——一个“无”的对象指针,其含义趋于强调“这里需要填入一个东西”。
    从设计上来说,在DOM中一个功能确定的属性(包括事件)要不然就是已经有了确定的值,要不然就是空字符串和null之一,只有并非预先设计的属性才会是undefined。
    即:
    window.onload === null
    window.noSuchProperty === undefined
    但实际上对于FirefoxOpera来说,window.onload的默认值是undefined,而IE、Google Chrome和Safari中window.load的默认值是null
  2. 只有从未赋值过的并非预先设计的属性才会在in运算中返回false,一旦被赋值以后即使最后再被赋予undefined值也会在in运算中表现为true;除非使用delete操作。
    注意,在IE的早期版本中对一个DOM对象使用delete会引发一个异常,而在IE8标准模式中不存在这种问题、使用delete之后会恢复原型链上定义的默认属性——只是这个改动不适用于window这一全局对象。
    当var和function被用作声明时,所产生的变量和函数即使经过delete操作也不会有任何变化,delete无法消除一个使用声明,也不会改变其内容。
    即:
    "noSuchProperty" in document == false
    document.propName = void(0);
    "propName" in document == true
    delete document.propName; // 这一行在IE的早期版本中会产生异常,而在IE8标准模式中可以正确执行;但对window对象进行这样的操作时仍会产生异常。
    "propName" in document == false
  3. "propName" in { propName: void(0) } == true
    0 in [,1] == false
    0 in [void(0),1] == true,但IE、JScript引擎会得到false,因此尽量不要使用这种形式。如果必须用这种形式,就需要用null来代替undefined。

写到这里,《JavaScript之undefined》这个系列大约就是结束了。

这一篇(“下”篇,本系列的第三部分)在计划中本来应该是最详细的一篇,但我在写的过程中突然想换一种表达方式,而后又因为一些其它的事情断断续续,所以最后写出来一看却是意外的短。

恐怕这一篇中遗漏了一些本来应该写出来的东西,但我一时间实在想不起来了——如果以后想起来的话再补上吧。