JavaScript批量定义类型判断方法的优化技巧

作者:巡夜人时间:2026-10-26 05:59:27浏览:631

本文介绍了一种在JavaScript中批量定义类型判断方法的优化写法。通过分析ExtJS源码,发现重复的isType函数模式,提出使用闭包和循环动态生成多个判断方法。该方法能显著减少代码量并提高加载效率,同时支持对特定类型进行覆盖以处理特殊逻辑,如isFinite检查。

JavaScript批量定义类型判断方法的优化技巧

代码如下:

 
isArray : function(v){
return toString.apply(v) === '[object Array]';
}, 
isDate : function(v){
return toString.apply(v) === '[object Date]';
}, 
isObject : function(v){
return !!v && Object.prototype.toString.call(v) === '[object Object]';
}, 
isPrimitive : function(v){
return Ext.isString(v) || Ext.isNumber(v) || Ext.isBoolean(v);
}, 
isFunction : function(v){
return toString.apply(v) === '[object Function]';
}, 
isNumber : function(v){
return typeof v === 'number' && isFinite(v);
}, 
isString : function(v){
return typeof v === 'string';
}, 
isBoolean : function(v){
return typeof v === 'boolean';
} 

上述代码源自ExtJS 3.x版本的ext-base.js文件,用于判断变量类型。仔细观察可以发现,其中存在大量结构相似的代码片段,例如:


代码如下:

 
is类型:function(v){
return toString.apply(v) ==="类型";
} 
或者
is类型:function(v){
returntypeof v ==="类型";
} 

尽管内部实现中使用了typeof,但我们可以统一采用toString方法来判断类型,从而将所有上述代码整合为同一种模式,即:


代码如下:

 
var is类型=function(v){
return toString.call(v) ==="类型";
} 

上述代码是一个基础模型,对应判断方法体内部逻辑一致。我们可以对其进行简化(尽管这会牺牲部分可读性),从而大幅减少代码体积,进而提升JavaScript的加载效率。改进后的代码如下:


代码如下:

 
var Easy={}, dataTypes = ["Number", "Boolean", "String", "Array",
"Object", "Function", "Date", "RegExp"];
var toStr = Object.prototype.toString;
var is = function (v, t) {
return toStr(o) == "[object " + t + "]";
}; 
for (var i = 0, len = dataTypes.length, t; i < len; i++) {
(function (t) {
Easy["is" + t] = function (o) {
return is(o, t);
} 
})(dataTypes[i]);//用到了闭包
} 

通过这段代码,我们为Easy对象创建了8个以is开头的类型判断方法。当然,如果某些方法的逻辑不合理,还可以进行覆盖,例如:


代码如下:

 
Easy.isNumber=function(v){
return toString.call(v) ==="[object Number]"&& isFinite(v);
} 

因此,当需要编写功能类似的方法时,可以考虑采用这种写法。

作者最新文章