HTML5テクニカルノート
オブジェクトが配列かどうかを確かめる
- ID: FN1511002
- Technique: HTML5 and JavaScript
JavaScriptでオブジェクトが配列かどうかを確かめたい場合があります。そのときtypeof演算子は使えません。配列については、文字列"object"が返されるからです。いくつかのやり方が考えられます。
01 Array.isArray()メソッドを使う
ECMAScript 5.1でArray.isArray()メソッドが備わりました。モダンブラウザを対象とするなど、ブラウザの実装が差し支えなければこのメソッドを使うとよいでしょう。なお、Array.prototypeプロパティのオブジェクトは、配列であることにご注意ください。
// 以下はすべてtrueを返す Array.isArray([]); Array.isArray([1]); Array.isArray(new Array()); Array.isArray(Array.prototype); // 以下はすべてfalseを返す Array.isArray(); Array.isArray({}); Array.isArray(null); Array.isArray(undefined); Array.isArray(17); Array.isArray('Array'); Array.isArray(true); Array.isArray(false); Array.isArray({ __proto__: Array.prototype }); // Arrayクラスを継承
02 instanceof演算子を使う
instanceof演算子はプロトタイプチェーンを遡って、Object.prototype.constructorプロパティにオペランドと等しいコンストラクタ関数があるかどうかをブール値で返します。大抵の場合は、この演算子で配列かどうか確かめても大丈夫でしょう。
[] instanceof Array; // true {} instanceof Array; // false
ただし、オブジェクトのプロトタイプチェーンを調べるので、Arrayクラスが継承に含まれていればtrueと評価されます。
{ __proto__: Array.prototype } instanceof Array; // true
さらに詳しく述べると、異なるwindowオブジェクトは、異なるグローバル空間になります。そのため、instanceof演算子で調べると、異なるwindowオブジェクトの配列は別とみなされるのです。
03 文字列表現にして確かめる
MDN「Array.isArray()」は、このメソッドが使えないときの対策として、文字列表現に直す手法を紹介しています。jQuery.isArray()メソッドも同じ実装にもとづいているようです。
if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; }
なお、本稿と同じ話題を扱ったWeb Tech Blog「Determining with absolute accuracy whether or not a JavaScript object is an array」には、Function.nameプロパティを使う方法がコメントされていました。ただし、このプロパティはまだ標準に加えられていないことに注意しなければなりません。
[].constructor.name; // "Array"
作成者: 野中文雄
更新日: 2015年12月18日 若干の補遺。
作成日: 2015年11月25日
Copyright © 2001-2015 Fumio Nonaka. All rights reserved.