首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript:检查变量是函数、数组还是对象的最有效方法

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

Stack Overflow用户
提问于 2011-12-16 03:00:27
回答 2查看 258关注 0票数 2

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

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

我认为下面的方法没有优化,因为如果我知道isFunction = true,我就不想计算其他变量(isArray,isObject);

通过使用三元运算,计算它们的顺序是什么,从而优化资源?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2011-12-16 03:19:44

我会说这是我所能做到的“高效”。它很简短,但可读,应该可以正确地完成工作。它在拥有some原生实现的现代浏览器中表现出色,而且some的本质是它只执行回调,直到数组中的一项满足条件为止。

只需确保为较老的浏览器添加了Array.prototype.some

代码语言:javascript
复制
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');

这应该适用于ArrayDateErrorFunctionNullNumberObjectStringUndefined。我还没有对所有这些类型进行彻底的跨浏览器测试,所以在相信我的话之前,请确保做一些好的单元测试。

票数 2
EN

Stack Overflow用户

发布于 2011-12-16 03:24:03

下面的函数是dojo工具包测试数组、函数等的方法

代码语言:javascript
复制
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));
},

我不明白试图优化这类代码的意义。如果您真的关心优化,那么在不需要这些检查的地方,您可能应该使用更简单的非重载函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8525206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档