别了 JavaScript中的isXX系列


  本文标签:isUndefined

复制代码 代码如下:

isNull: function(a){
return a === null;
},
isUndefined: function(a){
return a === undefined;
},
isNumber: function(a){
return typeof a === number;
},
isString: function(a){
return typeof a === string;
},
isBoolean: function(a){
return typeof a === boolean;
},
isPrimitive: function(b){
var a = typeof b;
return !!(b === undefined || b === null || a == boolean || a == number || a == string);
},
isArray: function(a){
return proto_obj.toString.call(a) === [object Array];
},
isFunction: function(a){
return proto_obj.toString.call(a) === [object Function];
},
isPlainObject: function(o){
if (!o || o === win || o === doc || o === doc.body) {
return false;
}
return isPrototypeOf in o && proto_obj.toString.call(o) === [object Object];
},
isWindow: function(o){
return o && typeof o === object && setInterval in o;
},
isEmptyObject: function(o){
for(var a in o) {
return false;
}
return true;
}

以上isXX系列中,isUndefined在类库中用的最多 。如判断是否传入了某个参数,判断对象是否拥有某个属性等等 。但这个函数是不必存在,我已将其移除 。理由如下

1,isUndefined 与 使用全等(===)或typeof 多了一层函数调用 。很明显多一层函数调用比直接使用原生的运算符效率会低(虽然有些微不足道),但如果isUndefined调用次数很多如上万次还是很明显的 。我曾经在邮箱框架中加入了该函数,调用次数有4000多次,从性能分析工具看占用了近1%的时间 。仅仅一个判断占1%的调用时间还是很可怕的 。当然,邮箱框架内的isUndefined处在多层闭包的顶层,访问其也会占用较多时间 。如果这一条还不足以让你放弃isUndefined,请看下面 。
2,函数从一定程度上是对一些代码的封装,抽象 。是组织良好代码的方式之一,且有利于降低代码的复杂性 。但isNull/isUndefined/isBoolean/isNumber/isString函数内仅有一句,抽象层次很低 。因此完全不必封装而提取出一个函数 。
3,isUndefined(a) 与 a === undefined相比并不会节省几个字节(呵,你可以命名的更短但损失了可读性) 。
综上,我去掉了类库中对基本类型判断的isNull/isUndefined/isBoolean/isNumber/isString,需要用到这些判断的时候直接使用typeof运算符等 。