让我们假设我们有一个变量,它可以是一个函数,对象或数组。
我想找到最有效的方法来确定它。
我认为下面的方法没有优化,因为如果我知道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发布于 2011-12-16 03:19:44
我会说这是我所能做到的“高效”。它很简短,但可读,应该可以正确地完成工作。它在拥有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、String和Undefined。我还没有对所有这些类型进行彻底的跨浏览器测试,所以在相信我的话之前,请确保做一些好的单元测试。
发布于 2011-12-16 03:24:03
下面的函数是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));
},我不明白试图优化这类代码的意义。如果您真的关心优化,那么在不需要这些检查的地方,您可能应该使用更简单的非重载函数。
https://stackoverflow.com/questions/8525206
复制相似问题