今天看prototype源码时发现有一段代码很奇怪 switch(o) { case null: return NULL_TYPE; case (void 0): return UNDEFINED_TYPE; } 为什么第二个case的值是(void 0)? 从这段代码可以看出,它是对null和undefined进行判断。 第二个case的判断条件就是undefined。那么它为什么使用void 0而不是直观的undefined呢? 学习过javascript的同学知道undefined是一个全局属性,表示未定义或定义了没有赋值。 void是一个一元运算符,不管传入什么参数都会返回undefined。 到网上google一下,发现void操作符是在ECMAScript v1中定义的,而undefined是在ECMAScript v5中定义的。 好了,我们知道这个用法是为了兼容老版本的浏览器。那么还有其它的区别吗? 我们知道undefined不是javascript的保留字,所以我们可以用undefined作为变量名。这时,我们定义的undefined就会影响到使用undefined作为判断的地方。 那么,真是这样吗? 我的测试代码是这样的: undefined=123; console.log(undefined); console.log(void 0); 结果在chrome17和firefox10里面打印的结果是2个undefined,但是在ie9里面打印的是123和undefined。 我只能说chrome17和firefox10很智能。 同时,我去测试了一下这两种方式的性能差别。 我的测试代码是这样的: var j=10000000,res; var t1=new Date(); for(var i=0;i<j;i++){ res=undefined; } var t11=new Date(); console.log(t11.getTime()-t1.getTime()); var t2=new Date(); for(var i=0;i<j;i++){ res=void 0; } var t22=new Date(); console.log(t22.getTime()-t2.getTime()); 发现它们性能没多大区别。但是我却发现chrome17的时间在140ms左右,firefox10在28ms,ie9在440ms。chrome和firefox的结果让我诧异。 最后,总结一下: 使用void 0代替undefined是为了兼容性以及预防代码的不规范(自己修改undefined的值)。
?