Javascript:检查变量是函数、数组还是对象的最有效方法
假设我们有一个变量,可以是函数、对象或数组 我想找到最有效的方法来确定它 我认为以下方法没有得到优化,因为如果我知道Javascript:检查变量是函数、数组还是对象的最有效方法,javascript,Javascript,假设我们有一个变量,可以是函数、对象或数组 我想找到最有效的方法来确定它 我认为以下方法没有得到优化,因为如果我知道isFunction=true我不想计算其他变量(isArray,isObject) 计算它们的顺序是什么,优化了资源, 通过使用三元运算 var isFunction, isArray, isObject; var obj = function () {}; isFunction = (typeof obj === "function") ? true : f
isFunction=true
我不想计算其他变量(isArray,isObject)
计算它们的顺序是什么,优化了资源,
通过使用三元运算
var isFunction,
isArray,
isObject;
var obj = function () {};
isFunction = (typeof obj === "function") ? true : false;
isArray = (obj.length > 0) ? true : false;
isObject = (typeof obj === "object") ? true : false;
console.log(isFunction , isArray , isObject ); // true, false, false (the good way)
console.log(isFunction , isArray , isObject ); // true, undefined, undefined
我认为这是我所能做到的最“有效”的。它很短,但可读性强,应该能正确地完成任务。它将在具有some
本机实现的现代浏览器中执行,并且some
的性质是,它只在数组中的一个项满足条件之前执行回调
只需确保为旧浏览器添加插件即可
function isOneOf(obj, types) {
var type;
type = Object.prototype.toString.call(obj);
return types.split(' ').some(function (t) {
return type.indexOf(t) > -1;
});
}
isOneOf({}, 'Array Object Function');
这适用于
数组
,日期
,错误
,函数
,空
,数字
,对象
,字符串
,以及未定义
。我还没有对所有这些类型进行彻底的跨浏览器测试,所以在相信我的话之前,一定要做一些好的单元测试。以下函数是dojo toolkit测试数组、函数等的方法
isString = function(it){
return (typeof it == "string" || it instanceof String); // Boolean
},
isArray = function(it){
return it && (it instanceof Array || typeof it == "array"); // Boolean
},
isFunction = function(it){
return opts.call(it) === "[object Function]";
},
isObject = function(it){
return it !== undefined &&
(it === null || typeof it == "object" || lang.isArray(it) || lang.isFunction(it)); // Boolean
},
isArrayLike = function(it){
return it && it !== undefined && // Boolean
// keep out built-in constructors (Number, String, ...) which have length
// properties
!lang.isString(it) && !lang.isFunction(it) &&
!(it.tagName && it.tagName.toLowerCase() == 'form') &&
(lang.isArray(it) || isFinite(it.length));
},
我看不出优化这种代码的意义。如果您真的关心优化,您可能应该在不需要这些检查的情况下使用更简单的非重载函数。为什么您认为
[]
不是数组?而且,您不需要?true:false
未定义
,null
,<1
,NaN
在布尔
解析时均等于false
。我不明白你想要什么。。。请说得更具体些。为什么你需要知道?JavaScript不是强类型语言。为什么不只是根据情况检查并确保对象与您期望的对象类型相似呢?此外,您正在执行这些关系比较,并且它们已经返回布尔值,因此使用“?:”运算符是毫无意义的。要检查真正的数组,您应该使用obj instanceof array
。