JavaScriptには、ネイティブオブジェクトとホストオブジェクトがあります。一般に、ネイティブオブジェクトの操作などに依存できますがObject.keys
、ホストオブジェクトの操作には依存できません。window
、、document
およびその他はホストオブジェクトです。call
特にIEは、そのホストオブジェクトがネイティブのようではないことでよく知られています(ホスト関数にはまたは機能がありませんapply
など)。
あるいは、もちろん、それは列挙可能なdocument
プロパティを持たない可能性があります。オブジェクトのデフォルトのプロパティのほとんどは列挙できないため、に表示されません。たとえば、両方とも多くのプロパティを持っているにもかかわらず、どちらも列挙可能なプロパティを持っていないためです(これらはすべての「メソッド」のプロパティを持っており、もちろん空白の配列にはプロパティがあり、にはプロパティがあります)。Object.keys
Object.keys([]).length
Object.keys(new RegExp(".*")).length
0
length
RegExp
lastIndex
更新:そして実際、それは列挙可能なものでした。このテストを試してください:
alert(Object.keys(window.document).length);
window.document.AAA__expando__property = "foo";
alert(Object.keys(window.document).length);
私の場合、IE9では、これらのアラートはそれぞれ「0」と「1」です。したがってwindow.document
、をサポートします。デフォルトでは、列挙可能なプロパティがないObject.keys
だけです。(対照的に、Chromeでは最初に65の列挙可能なプロパティを取得し、もちろん、エキスパンドを追加すると66のプロパティを取得します。)window.document
これはかなり完全なテストページ(ライブコピー)です(すぐにハッキングされ、美しいものではありません):
window.onload = function() {
document.getElementById('theButton').onclick = function() {
if (typeof Object.keys !== 'function') {
display("<code>Object.keys</code> is not a function");
return;
}
showKeys("Before adding", Object.keys(window.document));
window.document.AAAA__expando__foo = "bar";
showKeys("After adding", Object.keys(window.document));
};
function showKeys(prefix, keys) {
var p, ul;
keys.sort();
prefix =
"[" + prefix +
"] Keys on <code>window.document</code> (" +
keys.length +
")";
if (keys.length !== 0) {
prefix += " (click to toggle list)";
}
p = display(prefix);
if (keys.length !== 0) {
ul = document.createElement("ul");
ul.innerHTML = "<li>" + keys.join("</li><li>") + "</li>";
ul.style.display = "none";
document.body.appendChild(ul);
p.onclick = function() {
ul.style.display =
(ul.style.display === "none") ? "" : "none";
};
}
}
function display(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
return p;
}
};