JavaScriptには配列に typeof 演算子を使うと object が帰ってくるという糞仕様があるためみなさん苦労されている。
Douglas Crockfordさん
Douglas CrockfordさんのDuckTyping方式。JavaScript: The Good Parts 「6.5 配列かどうか」より抜粋
var is_array = function (value) { return value && typeof value === 'object' && typeof value.length === 'number' && typeof value.splice === 'function' && !(value.propertyIsEnumerable('length')); }
stackoverflowのみなさん
JavaScript: Check if object is array? によると
toString
toStringメソッドを使えば [object Array] が帰ってくる。必ず実装されているObject.prototype.toStringメソッドを使う。
var is_array = function (value) { return Object.prototype.toString.call( value ) === '[object Array]'; }
ECMAScript5 にはisArrayがある
var is_array = function (value) { return Array.isArray(value); }
組み合わせて
ブラウザによってisArrayメソッドがあるかわからない。しかしisArrayメソッドの方が速いのであるなら使いたい。
var is_array = ('isArray' in Array) ? Array.isArray : function (value) { return Object.prototype.toString.call(value) === '[object Array]'; };
jQuery にはisArrayがある
内部で似たようなことをしている
var is_array = $.isArray
さらに詳しく
instanceof 演算子を使えばいいのでは?とか他にも議論はあるのだけど、それも含めて Checking Types in Javascript に詳しく書いてある。要望があれば翻訳する。