JavaScriptの配列判定にオレオレ関数を使っていたんだけど、ECMAScript 5にArray.isArray
なんてステキな機能が追加されてたの巻。
■オレオレ配列判定関数
function isArray (arr) { var result = false; if (typeof arr !== 'undefined' && arr.splice) { result = true; }; return result; } |
でもこれだと偽装した配列にはお手上げ。
var testObj = { splice: function (){}, length: 10 }; if (isArray(testObj)) { console.log('OK'); } else { console.log('No'); }; // console // OK |
偽装Objectに配列用のプロパティやら関数とか全部のせちゃうと「オレオレisArray」は無力と化してしまいます。
まぁ、1人プロジェクトで使ってる限り偽装(?)って話ですが…
Array.isArray
MDN: isArray
ECMAScript 5で追加になったArray.isArrayを使えば大丈夫。
非対応ブラウザでも使用可能なコードが紹介されています。
CODE 1
if(!Array.isArray) { Array.isArray = function (vArg) { return vArg.constructor === Array; }; }; |
Google先生にお聞きすると次のコードにも出会いました。
stackoverflow: How to detect if a variable is an array
Object.prototype.toString.call(obj) === '[object Array]' |
toString.call(obj)
が'[object Array]'
だとArray(配列)になるからこれを判定に使えば良いのね。
CODE 2
if(typeof Array.isArray === 'undefined') { Array.isArray = function (obj) { return Object.prototype.toString.call(obj) === '[object Array]'; }; }; |
undefined
の真偽判定はtypeof
を使えってどれかの本に書いてあったからifのとこを書換えました。
最近大量にJavaScriptの本読んで、しかも斜め読みなのでどれに書いてあったか覚えてない。
というかほとんどが「typeof
使いなさい、悪いこといわないから」て書いてあった。
という訳で、CODE 1 か CODE 2のどちらかで実装できるので、どんなブラウザでも Array.isArray
が使える。
めでたしめでたし。
update 2012-06-08
このエントリーを見てMDNの中の人がコードを書き換えていました。
http://d.hatena.ne.jp/teramako/20120607/p1
vArg.constructor === Array
を使うとマズイらしいので CODE 2 を使うと良いらしいです。
配列判定は以下のコードを使って下さいな。
Object.prototype.toString.call(obj) === '[object Array]'
ピンバック: 超個人的メモ, JavaScript関連の投稿リンクをまとめておく « イナヅマtvログ
ピンバック: [JavaScript]this参照を変更せずにsetTimeoutを実行したい « イナヅマTVログ