判定方法: 1. Array オブジェクトの isArray() 関数を使用して、変数が配列かどうかを判定します。構文は「Array.isArray(obj)」です。配列の場合は戻り値を返します。 true、それ以外の場合は false を返します。 2. 「Object.prototype.toString()」から判断すると、構文は「Object.prototype.toString.apply(a) === '[object Array]'」です。
このチュートリアルの動作環境: Windows 7 システム、ECMAScript バージョン 6、Dell G3 コンピューター。
JS の弱い型の仕組みにより、若手フロントエンド開発者の面接では、変数の型の判断が必須の質問となっており、一般的には候補者を検討する際の最初の質問として使用し、これに基づいて進めます。
ES5 で変数が配列であるかどうかを判断する
ES5 では、値が配列であるかどうかを判断する方法が少なくとも次の 5 つあります。配列:
var a = []; // 1.基于instanceof a instanceof Array; // 2.基于constructor a.constructor === Array; // 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__: Array.prototype }; // 分别在控制台试运行以下代码 // 1.基于instanceof a instanceof Array; // => true // 2.基于constructor a.constructor === Array; // => true // 3.基于Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // => true // 4.基于getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // => true
上記では、4 つのメソッドはすべて true を返します。オブジェクトの __proto__ 属性を Array.prototype として手動で指定しただけで、そのオブジェクトは Array オブジェクトを継承することになりましたが、この無責任な継承方法により、継承による判断体系は一瞬にして崩壊してしまいました。
それだけでなく、Array はヒープ データであり、変数はその参照アドレスのみを指しているため、各ページの Array オブジェクトによって参照されるアドレスが異なることもわかります。 iframe で宣言された配列の場合、そのコンストラクターは iframe 内の Array オブジェクトです。配列 x が iframe で宣言され、親ページの変数 y に割り当てられている場合、y 配列のインスタンスが親ページで使用され、結果は false になる必要があります。最後のものは文字列を返すため、参照の問題はありません。実際、複数のページまたはシステム間の対話は文字列でのみ可能です。
ES6 で変数が配列であるかどうかを判断する
配列の一般的な使用を考慮して、Array.isArray メソッドが ES6 に追加されています。 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) === '[object Array]'; }; }
[関連する推奨事項: JavaScript 学習チュートリアル]
以上がes6 で変数が配列であるかどうかを判断する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。