ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript はオブジェクトがオブジェクトであるか配列であるかを判断します

JavaScript はオブジェクトがオブジェクトであるか配列であるかを判断します

黄舟
黄舟オリジナル
2016-12-12 15:21:001194ブラウズ

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

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

オブジェクトの答えが返されますが、これは少し残念です。
2.instanceof 演算子、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. 結果(2)
上記の仕様は、Object.prototype.toString の動作を定義しています。まず、オブジェクトの内部プロパティ [[Class]] を取得し、次に「[object」に似たオブジェクトを返します。 Array]" という文字列が結果として返されます (ECMA 標準を読んだことがある人なら、[[]] が言語の内部で使用され、外部から直接アクセスできない「内部属性」と呼ばれる属性を表すために使用されることを知っているはずです)。 , call を使用すると、任意のオブジェクトの内部属性 [[Class]] を取得し、型検出を文字列比較に変換して目的を達成できます。まず、ECMA 標準の Array の説明を見てみましょう。
ECMA-262 は
new Array([ item0[, item1 [,…]]])
[[Class]] プロパティを書きました 新しく構築されたオブジェクトの が「Array」に設定されます
これを利用して、3 番目のメソッドが登場します。
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[オブジェクト配列]' ; 呼び出しは、toString の this 参照を検出対象のオブジェクトに変更し、このオブジェクトの文字列表現を返し、この文字列が '[object] であるかどうかを比較します。 Array]' を使用して、それが Array のインスタンスであるかどうかを判断します。もしかしたら、なぜ直接 o.toString() を使用しないのかと疑問に思われるかもしれません。まあ、Array は Object を継承していますが、toString メソッドも持ちますが、このメソッドは書き換えられて要件を満たさなくなる可能性があります。また、Object.prototype は虎の尻であり、あえて触ろうとする人はほとんどいません。ある程度の「純度」を保証できます:)
以前の解決策とは異なり、この方法はクロスフレームオブジェクト構築の問題を非常にうまく解決します。テストの結果、主要なブラウザの互換性も非常に優れているため、安心して使用できます。良いニュースとしては、jQuery、Base2 などの多くのフレームワークが、このメソッドを使用して、配列、正規表現などの特定の種類の特別なオブジェクトを、自分で作成することなく実装することを計画していることです。

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

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


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