Chinaunix首页 | 论坛 | 博客
  • 博客访问: 423009
  • 博文数量: 155
  • 博客积分: 2590
  • 博客等级: 少校
  • 技术积分: 2161
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-25 09:33
文章分类

全部博文(155)

文章存档

2015年(1)

2014年(2)

2013年(55)

2012年(97)

分类: Web开发

2013-03-20 16:54:01

今天看prototype源码时发现有一段代码很奇怪  
  1. switch(o) {  
  2.        case null: return NULL_TYPE;  
  3.        case (void 0): return UNDEFINED_TYPE;  
  4. }  
为什么第二个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作为判断的地方。  
那么,真是这样吗?  
我的测试代码是这样的:  
   
  1. undefined=123;  
  2.  console.log(undefined);  
  3.  console.log(void 0);  
结果在chrome17和firefox10里面打印的结果是2个undefined,但是在ie9里面打印的是123和undefined。  
我只能说chrome17和firefox10很智能。  
同时,我去测试了一下这两种方式的性能差别。  
   
我的测试代码是这样的:  
  1. var j=10000000,res;  
  2.  var t1=new Date();  
  3.  for(var i=0;i
  4.  res=undefined;  
  5.  }  
  6.  var t11=new Date();  
  7.  console.log(t11.getTime()-t1.getTime());  
  8.  var t2=new Date();  
  9.  for(var i=0;i
  10.  res=void 0;  
  11.  }  
  12.  var t22=new Date();  
  13.  console.log(t22.getTime()-t2.getTime());  
发现它们性能没多大区别。但是我却发现chrome17的时间在140ms左右,firefox10在28ms,ie9在440ms。chrome和firefox的结果让我诧异。  
最后,总结一下:  
   
使用void 0代替undefined是为了兼容性以及预防代码的不规范(自己修改undefined的值)。  
原文链接:
阅读(1389) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~