2011-12-15 6 views
2

変数が関数、オブジェクトまたは配列であるとしましょう。Javascript:変数が関数、配列またはオブジェクトであるかどうかを確認する最も効率的な方法

私はそれを決定する最も効率的な方法を見つけたいと思っています。

私はそれが他の変数(isArray、isObject)を計算したくないことがわかっているので、以下の方法は最適化されていないと思う。isFunction = true;

リソースを最適化するために計算する順序はどのようなものですか? は3項演算を使用していますか?

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

なぜあなたは '[]'が配列ではないと思いますか?また、あなたは '?真:偽」。 – SLaks

+0

''未定義 ''、 ''ヌル ''、 '<1'、' 'NaN''は' 'ブール'私はあなたが欲しいものを理解していない...より具体的にしてください。 –

+1

なぜあなたは知る必要がありますか? JavaScriptは強く型付けされた言語ではありません。状況に応じてチェックし、オブジェクト*があなたが期待するオブジェクトのように見えるのはなぜですか? – Pointy

答えて

2

私はこれを「効率的」と言います。それは短くて読みやすいものであり、仕事を正しく行うべきです。 someのネイティブ実装を持つ最新のブラウザーではパフォーマンスが向上し、someという性質は、配列内の項目の1つが条件を満たすまでコールバックを実行するようなものです。

古いブラウザの場合は、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'); 

これはArrayDateErrorFunctionNullNumberObjectString、およびUndefinedのために働く必要があります。私はこれらすべてのタイプのクロスブラウザテストを徹底していませんので、私の言葉を取る前にいくつかの良いユニットテストをしてください。

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

方法です。最適化について実際に気にしていた場合は、これらのチェックが不要な単純なオーバーロードされていない関数を使用してください。

関連する問題