怎样写出更好的JavaScript程序之undefined篇(下)
2009-12-05 11:21 Nana's Lich 阅读(1517) 评论(2) 编辑 收藏 举报
这个系列终于到了最后一篇了,在前两篇之中我介绍了undefined这个概念的常见使用办法、最方便有效的办法以及其它变种。
这一篇主要的目的是总结几种常见办法的优势劣势、各自的适用情况,以及可能存在的误区。
为了直观表示,我不再作过多的描述,而是直接用表格把各种办法之间的差别列出:
而容易产生误解的细节中,我认为比较重要的是这些:
- null和undefined的不同意义:虽然一般的相等比较运算符会认为这两者是相等的,但实际上并不完全如此。
从本质上说undefined是属于“什么也没有”的状态,这也是它唯一要表达、要强调的;而null其实是一个对象指针——这里的对象是包括JavaScript(此处的JavaScript指ECMAScript 3的实现,包括JScript)函数在内的宽泛定义——一个“无”的对象指针,其含义趋于强调“这里需要填入一个东西”。
从设计上来说,在DOM中一个功能确定的属性(包括事件)要不然就是已经有了确定的值,要不然就是空字符串和null之一,只有并非预先设计的属性才会是undefined。
即:
window.onload === null;
window.noSuchProperty === undefined。
但实际上对于Firefox和Opera来说,window.onload的默认值是undefined,而IE、Google Chrome和Safari中window.load的默认值是null。 - 只有从未赋值过的并非预先设计的属性才会在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。 - "propName" in { propName: void(0) } == true;
0 in [,1] == false;
0 in [void(0),1] == true,但IE、JScript引擎会得到false,因此尽量不要使用这种形式。如果必须用这种形式,就需要用null来代替undefined。
写到这里,《JavaScript之undefined》这个系列大约就是结束了。
这一篇(“下”篇,本系列的第三部分)在计划中本来应该是最详细的一篇,但我在写的过程中突然想换一种表达方式,而后又因为一些其它的事情断断续续,所以最后写出来一看却是意外的短。
恐怕这一篇中遗漏了一些本来应该写出来的东西,但我一时间实在想不起来了——如果以后想起来的话再补上吧。