Javascript:检查变量是函数,数组还是对象的最有效方法

时间:2011-12-15 19:00:27

标签: javascript

假设我们有一个可以是函数,对象或数组的变量。

我想找到最有效的方法来确定它。

我认为以下方式没有优化,因为如果我知道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

2 个答案:

答案 0 :(得分:2)

我认为这就像我能做到的那样“高效”。它简短但可读,应该正确地完成工作。它在具有some的本机实现的现代浏览器中将具有高性能,some的性质使得它只执行回调,直到数组中的一个项满足条件。

请确保为旧浏览器添加Array.prototype.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');

这适用于ArrayDateErrorFunctionNullNumberObject,{ {1}}和String。我还没有对所有这些类型进行过彻底的跨浏览器测试,因此请确保在接受我的话之前进行一些良好的单元测试。

答案 1 :(得分:0)

以下函数是dojo工具包如何测试数组,函数等的方法

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));
},

我没有看到尝试优化此类代码的重点。如果你真的关心优化,你应该使用更简单的非重载函数,而不需要这些检查。