@ledsun blog

無味の味は佳境に入らざればすなわち知れず

JavaScriptの値が配列かどうか見分ける方法のまとめ

f:id:ledsun:20130128231440j:plain

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 に詳しく書いてある。要望があれば翻訳する。

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス JavaScript 第6版 JavaScript徹底攻略 (WEB+DB PRESS plus) プロになるためのJavaScript入門 ~node.js、Backbone.js、HTML5、jQuery-Mobile (Software Design plus) マンガでわかるJavaScript