JavaScriptでArrayの判定

これで出来ると思ってたんだけど
ObjectもArrayも同じ値が返ってきちゃう

var Foo = [];
console.log(typeof Foo);
// => object

var Bar = {};
console.log(typeof Bar);
// => object


JavaScript: Good Parts曰く

var is_array = function(value) {
	return value &&                             
		typeof value === 'object' &&
		typeof value.length === 'number' &&
		typeof value.splice === 'function' &&
		!(value.propertyIsEnumerable('length'));
}

長い
やってることとしては

  1. nullやfalsyな値を除外
  2. object以外を除外。nullも含むが1. で除外済み
  3. lengthプロパティ持ってて数値であるか
  4. その値がspliceメソッドを持っているか
  5. lengthプロパティが列挙可能か

って流れ。

Object.prototype.length = function() {};

とかでアレコレ拡張してたらややこしくなりそう


もっと簡単ないかなーって調べてたら
ECMAScript 5th EditionにArray.isArrayってのがあるんですね。

//
// Array.isArray(obj)
//

// all following calls return true
Array.isArray([]);
Array.isArray([1]);
Array.isArray( new Array() );
Array.isArray( Array.prototype ); // Little known fact: Array.prototype itself is an array.
 
// all following calls return false
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray("Array");
Array.isArray(true);
Array.isArray(false);


併せて非対応ブラウザ向け互換性維持コード

if(!Array.isArray) {  
  Array.isArray = function (vArg) {  
    return Object.prototype.toString.call(vArg) === "[object Array]";  
  };  

しんぷる。

みんな色々やってておもしろい
http://stackoverflow.com/questions/1058427/how-to-detect-if-a-variable-is-an-array

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス