日期:2014-05-16  浏览次数:20395 次

javascript 中 undefine于void 0区别
今天看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的值)。
 

?