假设我们有一个可以是函数,对象或数组的变量。
我想找到最有效的方法来确定它。
我认为以下方式没有优化,因为如果我知道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
答案 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');
这适用于Array
,Date
,Error
,Function
,Null
,Number
,Object
,{ {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));
},
我没有看到尝试优化此类代码的重点。如果你真的关心优化,你应该使用更简单的非重载函数,而不需要这些检查。