2011-12-15 73 views
2

假設我們有一個變量可以是函數,對象或數組。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 
+3

你爲什麼認爲````不是數組?另外,你不需要`? true:false`。 – SLaks 2011-12-15 19:02:00

回答

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'); 

這應該適用於ArrayDateErrorFunctionNullNumberObjectStringUndefined。我沒有對所有這些類型進行徹底的跨瀏覽器測試,因此請務必在採取措施之前進行一些良好的單元測試。

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

我看不到的努力來優化這種代碼的地步。如果你真的關心優化,你可能應該使用簡單的非重載函數,而這些檢查不是必需的。

相關問題