1、のinstanceofによって決定されます
試験原型プロパティどこコンストラクタ鎖にinstanceof演算子プロトタイプオブジェクトに存在し、ブール値を返します。
=せて[]。instanceofは配列; // 真 のlet B = {}; B instanceofはアレイ。// 偽
上記のコードでは、instanceof演算子はArray.prototypeを属性はプロトタイプチェーン変数Aに存在する検出配列が明らかにArray.prototypeをプロパティを有している、それは本当です。
最初に、それは常に真でなければならない真であると判断されていないので、prototypeプロパティを変更することができ、注意すべきです。
第二に、スクリプト私たちは、そのようなオブジェクトが複数所有しているIFRAME、instanceofは検証結果は、例えば、期待できないかもしれないhtmlとしてとして、よりグローバルな環境を持っている場合:
//は、iframeオブジェクト本体の作成と追加 VARはiframe =のdocument.createElement( 'IFRAME'を)。 document.body.appendChild(IFRAME)。 // 配列iframeオブジェクト取得するコンストラクタメソッド Xarray window.frames = [0 ] .ARRAYを; //は、コンストラクタのインスタンスを取得 するvar ARR = 新しい新しい Xarray(L、2,3 )。 ARR instanceofはアレイと、// 偽
この問題原因はiframeが新しい地球環境を生成しますので、それはまた、独自のArray.prototypeをプロパティ、同じことが明らかに危険な慣行であるように、異なる状況下での特性を有し、Array.prototypeをそう!== window.frames [0] .Array.prototype、配列が真のinstanceof ARRしたいが、あなたはARR可能な場合、元のArrayコンストラクタから作成されていることを確認する必要があります。
図2に示すように、決定することによってコンストラクタ
我々は、コンストラクタプロパティコンストラクタインスタンスコンストラクタポイントは、次にコンストラクタプロパティで、アレイかどうかを決定することができることを知っています。
せ= [1,3,4 ]。 a.constructor ===アレイ。// 真
再び、この決意は、地球環境問題の複数となり、問題がinstanceofを同じ引き起こさ。
3、Object.prototype.toString.callによって()分析
Object.prototype.toString()。()の呼び出しは、異なるタイプのオブジェクトを取得することができ、地球環境の複数を適用することも可能です
// チェック配列の場合 せてA = [2、3 ] Object.prototype.toString.call(A) === '[配列オブジェクト]'; // trueに // テストの機能かどうか のlet B = 関数(){}。 Object.prototype.toString.call(B) === '[オブジェクト機能]'; // trueに // テストが数かどうかを C =を聞かせ1。; Object.prototype.toString.call(C) === '[オブジェクト番号]'。// 真
4、Array.isArrayによって()分析
使いやすいだけでなく、地球環境のために、より、Array.isArray()は正確に同じことを判断することができますが、ES5前にこのメソッドをサポートしていない存在する可能性のあるES5で提示された問題、Array.isArrayは()があり、状況。
= [1,2,3せ】 Array.isArray(A)。// 真
最終的に推奨される方法
もし(!Array.isArray){ Array.isArray = 関数(引数){ リターン Object.prototype.toString.call(引数)=== '[オブジェクト配列]' 。 }。 }