Crockford はJavascriptで解決策を提案しています。
var isArray = function (obj) {
return obj && typeof obj === "object" && obj.constructor === Array;
}
しかし、彼は続けて次のように述べています。
...別のウィンドウまたはフレームで構築された配列を識別できません...
このソリューションがその状況で機能しないのはなぜですか?
Crockford はJavascriptで解決策を提案しています。
var isArray = function (obj) {
return obj && typeof obj === "object" && obj.constructor === Array;
}
しかし、彼は続けて次のように述べています。
...別のウィンドウまたはフレームで構築された配列を識別できません...
このソリューションがその状況で機能しないのはなぜですか?
シンボル「配列」は、各ウィンドウにローカルなものです。したがって、別のウィンドウで構築されたオブジェクトに特定のネイティブ コンストラクターがあるかどうかを確認することはできません。
つまり、ウィンドウ #1 には、「配列」コンストラクター関数があります。ウィンドウ #2 にも 1 つあります。もちろん、それらは同じですが、それらは別個のオブジェクトであるため、異なります。比較が行われると、オブジェクトの比較が行われる方法で行われます。つまり、2 つの値がまったく同じオブジェクトへの参照であるか、そうでないかのいずれかです。
JavaScript がこのように動作するのはちょっと奇妙ですが、これは言語の性質です。
jQuery は atoString.call(obj)
を実行し、結果が の場合"[object Array]"
、そのisArray()
関数は を返しますtrue
。
他の場合では、jQuery が配列のようなオブジェクト (DOM コレクションを含む) を探しているだけの場合、.length
プロパティがあるかどうかを確認するだけです。これは明らかに絶対確実ではありませんが、単純なオブジェクトや他の単純な型とは区別されます。