3

Object.keys()メソッドは、次のようなコードで正常に機能します。

var foo = {foo: 1, bar: 2};
console.log(Object.keys(foo).length);

ただし、Object.keys()は、次のようなコードを持つ組み込みオブジェクトの長さゼロの配列を返します。

<!doctype html> 
<html>

<head>

<title>Object.keys()</title>

</head>

<body>
<script type="text/javascript">
console.log(Object.keys(window.document).length);
</script>

</body>

</html>

私は何かが足りないのですか?InternetExplorer9.0.8112.16421を使用しています。


追記:なぜこれが(たとえば)なのかはまだわかりません:

    for (prop in performance.timing) {
        if (performance.timing.hasOwnProperty(prop)) {
            console.log(prop); 
        }
    }

... IE9では何も生成されませんが、これは正常に機能します。

for (prop in performance.timing) {
    console.log(prop); 
}
4

1 に答える 1

5

JavaScriptには、ネイティブオブジェクトホストオブジェクトがあります。一般に、ネイティブオブジェクトの操作などに依存できますがObject.keys、ホストオブジェクトの操作には依存できません。window、、documentおよびその他はホストオブジェクトです。call特にIEは、そのホストオブジェクトがネイティブのようではないことでよく知られています(ホスト関数にはまたは機能がありませんapplyなど)。

あるいは、もちろん、それは列挙可能なdocumentプロパティを持たない可能性があります。オブジェクトのデフォルトのプロパティのほとんどは列挙できないため、に表示されません。たとえば、両方とも多くのプロパティを持っているにもかかわらず、どちらも列挙可能なプロパティを持っていないためです(これらはすべての「メソッド」のプロパティを持っており、もちろん空白の配列にはプロパティがあり、にはプロパティがあります)。Object.keysObject.keys([]).lengthObject.keys(new RegExp(".*")).length0lengthRegExplastIndex


更新:そして実際、それは列挙可能なものでした。このテストを試してください:

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;
  }

};
于 2011-06-15T11:11:55.733 に答える