4

Crockford はJavascriptで解決策を提案しています。

var isArray = function (obj) {
   return obj && typeof obj === "object" && obj.constructor === Array;
}

しかし、彼は続けて次のように述べています。

...別のウィンドウまたはフレームで構築された配列を識別できません...

このソリューションがその状況で機能しないのはなぜですか?

4

2 に答える 2

4

シンボル「配列」は、各ウィンドウにローカルなものです。したがって、別のウィンドウで構築されたオブジェクトに特定のネイティブ コンストラクターがあるかどうかを確認することはできません。

つまり、ウィンドウ #1 には、「配列」コンストラクター関数があります。ウィンドウ #2 にも 1 つあります。もちろん、それらは同じですが、それらは別個のオブジェクトであるため、異なります。比較が行われると、オブジェクトの比較が行われる方法で行われます。つまり、2 つの値がまったく同じオブジェクトへの参照であるか、そうでないかのいずれかです。

JavaScript がこのように動作するのはちょっと奇妙ですが、これは言語の性質です。

于 2012-07-22T03:33:12.857 に答える
1

jQuery は atoString.call(obj)を実行し、結果が の場合"[object Array]"、そのisArray()関数は を返しますtrue

他の場合では、jQuery が配列のようなオブジェクト (DOM コレクションを含む) を探しているだけの場合、.lengthプロパティがあるかどうかを確認するだけです。これは明らかに絶対確実ではありませんが、単純なオブジェクトや他の単純な型とは区別されます。

于 2012-07-22T03:43:02.233 に答える