今天看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
-
res=undefined;
-
}
-
var t11=new Date();
-
console.log(t11.getTime()-t1.getTime());
-
var t2=new Date();
-
for(var i=0;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的值)。
原文链接:
阅读(1383) | 评论(0) | 转发(0) |