ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript はオブジェクトが配列メソッドであるかどうかを判断します

JavaScript はオブジェクトが配列メソッドであるかどうかを判断します

伊谢尔伦
伊谢尔伦オリジナル
2017-07-26 11:41:031404ブラウズ

開発では、オブジェクトが配列型であるかどうかを判断する必要があることがよくあります

1.typeof 演算子は、関数、文字列、数値、未定義な​​どのいくつかの型のオブジェクトに対して完全に機能しますが、配列型である場合は、 Array

var arr=new Array("1","2","3","4","5"); 
alert(typeof(arr));

少し残念なオブジェクトの答えが返されます。

2. JavaScript の instanceof 演算子は、オブジェクトが特定のクラスのインスタンスであるかどうかを示すブール値を返します。
使用法: result = クラスのオブジェクトのインスタンス、先ほどの配列のままです。もう一度試してみると、正常に true が返されました。

var arrayStr=new Array("1","2","3","4","5"); 
alert(arrayStr instanceof Array);

簡単な要約: 今日議論した問題は解決されたように見えますが、実際には複数の解決策があります。フレーム間のシャトルは大きな問題を引き起こします。

コード

var iframe = document.createElement('iframe'); 
document.body.appendChild(iframe); 
xArray = window.frames[window.frames.length-1].Array; 
var arr = new xArray("1","2","3","4","5");//这个写法IE大哥下是不支持的,FF下才有 
alert(arr instanceof Array); // false 
alert(arr.constructor === Array); // false

返される結果は 2 つの False で、非常に残念です。

ECMA-262 は
Object.prototype.toString( ) を作成しました。 toString メソッドが呼び出されるとき、次の手順が実行されます。
1. このオブジェクトの [[Class]] プロパティを取得します。
2. 3 つの文字列「[object "、Result (1)、および "]" を連結します。
3. Return Result (2)

上記の仕様は、Object.prototype.toString の動作を定義します。まず、 object 属性 [[Class]] を呼び出し、この属性に基づいて、結果として「[object Array]」に似た文字列を返します (ECMA 標準を読んだことがある人は、[[]] が内部属性を表すために使用されることを知っているはずです)外部から直接アクセスできないプロパティは「内部プロパティ」と呼ばれます)。このメソッドを呼び出しと組み合わせて使用​​すると、任意のオブジェクトの内部属性 [[Class]] を取得し、型検出を文字列比較に変換して目的を達成できます。まず ECMA 標準における Array の説明を見てみましょう:

ECMA-262 writes
new Array([ item0[, item1 [,…]]])
新しく構築されたオブジェクトの [[Class]] プロパティが「配列」に設定されています
これを利用して、3番目の方法が登場します。
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
} 呼び出しは、toString の this 参照を検出対象のオブジェクトに変更し、文字列表現を返します。この object の値を調べ、この文字列が '[object Array]' であるかどうかを比較して、それが Array のインスタンスであるかどうかを判断します。もしかしたら、なぜ直接 o.toString() を使用しないのかと疑問に思われるかもしれません。まあ、Array は Object を継承していますが、toString メソッドも持ちますが、このメソッドは書き換えられて要件を満たさなくなる可能性があります。また、Object.prototype は虎の尻であり、あえて触ろうとする人はほとんどいません。ある程度の「純度」を保証できます:)
以前の解決策とは異なり、この方法はクロスフレームオブジェクト構築の問題を非常にうまく解決します。テスト後、主要なブラウザの互換性も非常に優れているため、使用できます。自信を持って。良いニュースとしては、jQuery、Base2 などの多くのフレームワークが、このメソッドを使用して、配列、正規表現などの特定の種類の特別なオブジェクトを、自分で作成することなく実装することを計画していることです。

また、Ext3もこの書き方に変更されました

isArray : function(v){ 
return toString.apply(v) === '[object Array]'; 
}


以上がJavaScript はオブジェクトが配列メソッドであるかどうかを判断しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。