イナヅマTVログ

ECMAScript 5, Array.isArrayを非対応ブラウザでも使いたい

| 2件のコメント

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]'

2件のコメント

  1. ピンバック: 超個人的メモ, JavaScript関連の投稿リンクをまとめておく « イナヅマtvログ

  2. ピンバック: [JavaScript]this参照を変更せずにsetTimeoutを実行したい « イナヅマTVログ

コメントを残す