es6 では、Array の isArray() メソッドを使用して、変数が配列であるかどうかを判断できます。このメソッドは、オブジェクトが配列型であるかどうかを判断するために使用されます。配列の場合は true を返し、それ以外の場合は false を返します。
このチュートリアルの動作環境: Windows 7 システム、ECMAScript バージョン 6、Dell G3 コンピューター。
ES5 で変数が配列であるかどうかを判断する ES5 では
、値が配列であるかどうかを判断する方法が少なくとも次の 5 つあります
。 // 1.instanceof に基づく 配列のインスタンス。 // 2. コンストラクターに基づく a.constructor === 配列; // 3. Object.prototype.isPrototypeOf に基づく Array.prototype.isPrototypeOf(a); // 4. getPrototypeOf に基づく Object.getPrototypeOf(a) === Array.prototype; // 5. Object.prototype.toString に基づく Object.prototype.toString.apply(a) === '[object Array]';
上記では、 Object.prototype.toString
を除いて、他のメソッドは変数の型を正しく決定できません。
コードの実行環境は非常に複雑で、変数は作成者を混乱させるためにあらゆる種類のトリックを使用する可能性があります。
var a = {を
見てみましょう
__proto__: 配列.プロトタイプ }; //コンソールで次のコードをそれぞれ実行してみてください // 1.instanceof に基づく 配列のインスタンス; // => true // 2. コンストラクターに基づく a.constructor === 配列 // => true; // 3. Object.prototype.isPrototypeOf に基づく Array.prototype.isPrototypeOf(a); // => true // 4. getPrototypeOf に基づく Object.getPrototypeOf(a) === Array.prototype; // =>
上記では、4 つのメソッドはすべて true を返します。オブジェクトの __proto__ 属性を Array.prototype として手動で指定しただけで、オブジェクトは Array オブジェクトを継承することになり、この無責任な継承方法により、継承に基づく判断スキームが即座に崩壊してしまいました。
それだけでなく、Array はヒープ データであり、変数はその参照アドレスのみを指しているため、各ページの Array オブジェクトによって参照されるアドレスは異なることもわかります。 iframe で宣言された配列の場合、そのコンストラクターは iframe 内の Array オブジェクトです。配列 x が iframe で宣言され、親ページの変数 y に割り当てられている場合、y 配列のインスタンスが親ページで使用され、結果は false になる必要があります。最後のものは文字列を返すため、参照の問題はありません。実際、複数のページまたはシステム間の対話は文字列でのみ可能です。
ES6 での変数が配列であるかどうかの判断
: 配列の一般的な使用を考慮して、Array.isArray
メソッドを使用して変数が配列であるかどうかを判断するのは次のように非常に簡単です。
([]); // => true Array.isArray({0: 'a', length: 1}); // => false
実際、値の型を決定するためにObject.prototype.toString
を使用することは、主要な主流ライブラリの標準でもあります。したがって、Array.isArray のポリフィルは通常次のようになります:
if (!Array.isArray){ Array.isArray = function(arg){ return Object.prototype.toString.call(arg) === '[オブジェクト配列]'; }; }