Array.isArray

Firefoxでしか確認してないけど、Array.isArrayメソッドの優位性を知ったのでメモ。

<iframe id="testFrame" src="about:blank">
var iframe = document.getElementById("testFrame");
var doc = iframe.contentDocument;
var s = doc.createElement("script");
s.textContent = "var hogehoge = [0,1,2,3,4,5,6]";
doc.body.appendChild(s);

var array = iframe.contentWindow.hogehoge;

まあ、重要なのは別ドキュメント内で作られたArrayインスタンスがあること。ここでは、変数arrayが別ドキュメント内のArrayインスタンス

これが、Arrayインスタンスであることを確認するために

array instanceof Array

などとするとfalseが返る

理由は後で説明。

替わりにArray.isArrayメソッドを使うと良い感じ。

Array.isArray(array) // true

どういうこと?

仕様を確認してみましょう。

instanceof 演算子

変数arrayは別ドキュメントのArray.prototypeを参照しており、現ドキュメントのArray.prototypeとは別オブジェクトであったから、先ほどのは false を返したというわけ。

array instanceof iframe.contentWindow.Array

きちんとiframe内のArrayで比較してあげれば、trueが返る。
はい、面倒ですね。

Array.isArray メソッド

こちらは、プロトタイプが一致するかなどという比較はせずに文字列比較(?)なのでOKであった、というわけ。
ただ、プロトタイプ汚染がされていたとき、むやみにメソッドを使うと怪しい動きをするリスクはあるかも。