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')); }
長い
やってることとしては
- nullやfalsyな値を除外
- object以外を除外。nullも含むが1. で除外済み
- lengthプロパティ持ってて数値であるか
- その値がspliceメソッドを持っているか
- 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 ―「良いパーツ」によるベストプラクティス
- 作者: Douglas Crockford,水野貴明
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/12/22
- メディア: 大型本
- 購入: 94人 クリック: 1,643回
- この商品を含むブログ (187件) を見る