JavaScript でオブジェクトの型を検出する演算子には、typeof、instanceof、およびオブジェクトのコンストラクター属性が含まれます:
1) typeof 演算子 typeof は単項演算子であり、返される結果は、オブジェクトの型を説明する文字列です。オペランド。 例: 「数値」、「文字列」、「ブール値」、「オブジェクト」、「関数」、「未定義」 (変数が存在するかどうかを判断するために使用できます)。 ただし、typeof の機能は限られています。Date 型と RegExp 型に対しては「オブジェクト」を返します。例:
typeof {}; // "object" typeof []; // "object" typeof new Date(); // "object"
したがって、オブジェクトとプリミティブ型を区別する場合にのみ役立ちます。あるオブジェクト タイプを別のオブジェクト タイプと区別するには、他の方法を使用する必要があります。例:instanceof 演算子またはオブジェクトのコンストラクター属性。
2) 演算子のインスタンス。 instanceof 演算子では、左側のオペランドがオブジェクトであり、右側のオペランドがオブジェクト クラスの名前またはコンストラクターである必要があります。 object がクラスまたはコンストラクターのインスタンスである場合、instanceof 演算子は true を返します。 object が指定されたクラスまたは関数のインスタンスではない場合、または object が null の場合は false を返します。例:
[] instanceof Array; // true [] instanceof Object; // true [] instanceof RegExp; // false new Date instanceof Date; // true
したがって、instanceof 演算子を使用して、オブジェクトが配列型であるかどうかを判断できます:
function isArray(arr){ return arr instanceof Array; }
3) コンストラクター属性。 JavaScript では、各オブジェクトにはコンストラクター属性があり、オブジェクトを初期化するコンストラクターを参照して、不明なオブジェクトの種類を決定するためによく使用されます。たとえば、必要な値が与えられた場合、typeof 演算子を使用して、それがプリミティブ値であるかオブジェクトであるかを判断します。オブジェクトの場合は、コンストラクター属性を使用してその型を決定できます。したがって、配列を決定する関数は次のように書くこともできます:
function isArray(arr){ return typeof arr == "object" && arr.constructor == Array; }
多くの場合、オブジェクトのインスタンスオブ演算子またはコンストラクタープロパティを使用して、オブジェクトが配列であるかどうかを検出できます。たとえば、多くの JavaScript フレームワークは、これら 2 つのメソッドを使用して、オブジェクトが配列型であるかどうかを判断します。 ただし、クロスフレーム ページ内の配列を検出すると失敗します。その理由は、異なるフレーム (iframe) で作成された配列がプロトタイプのプロパティを相互に共有しないためです。例:
<script> window.onload=function(){ var iframe_arr=new window.frames[0].Array; alert(iframe_arr instanceof Array); // false alert(iframe_arr.constructor == Array); // false } </script>
プロトタイプ チェーン全体で toString() メソッドを呼び出す、Ajaxian の正確な検出メソッドを確認しました: Object.prototype.toString()。上記のクロスフレームワークの問題を解決できます。 Object.prototype.toString(o) が実行されると、次の手順が実行されます。 1) オブジェクト o のクラス属性を取得します。 2) 接続文字列: "[object "+result(1)+"]" 3) return result(2) 例:
Object.prototype.toString.call([]); // Return "[object Array] "
Object.prototype.toString.call(/reg/ig); // Return "[object RegExp]"
このようにして、オブジェクトが配列であるかどうかを判断する堅牢な関数を書くことができます:
function isArray(arr){ return Object.prototype.toString.call(arr) === "[object Array]"; }
このメソッドは多くの海外の JavaScript マスターによって認識されており、次期 jQuery 1.3 で配列を検出するために使用されます。 prototype.js の管理者は、オブジェクトの型名を取得するために使用される次の関数を作成しました
/** * Returns internal [[Class]] property of an object * * Ecma-262, 15.2.4.2 * Object.prototype.toString( ) * * When the toString method is called, the following steps are taken: * 1. Get the [[Class]] property of this object. * 2. Compute a string value by concatenating the three strings "[object ", Result (1), and "]". * 3. Return Result (2). * * __getClass(5); // => "Number" * __getClass({}); // => "Object" * __getClass(/foo/); // => "RegExp" * __getClass(''); // => "String" * __getClass(true); // => "Boolean" * __getClass([]); // => "Array" * __getClass(undefined); // => "Window" * __getClass(Element); // => "Constructor" * */ function __getClass(object){ return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; };
それを拡張して、さまざまなオブジェクト型を検出します:
var is ={ types : ["Array", "Boolean", "Date", "Number", "Object", "RegExp", "String", "Window", "HTMLDocument"] }; for(var i = 0, c; c = is.types[i ++ ]; ){ is[c] = (function(type){ return function(obj){ return Object.prototype.toString.call(obj) == "[object " + type + "]"; } )(c); } alert(is.Array([])); // true alert(is.Date(new Date)); // true alert(is.RegExp(/reg/ig)); // true
以上がJavaScript が演算子とプロパティを使用してオブジェクトの種類を決定する方法の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。