Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:检查变量是函数、数组还是对象的最有效方法_Javascript - Fatal编程技术网

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