javascript - Object.keys() 在 Internet Explorer 9 中是否适用于内置对象?

标签 javascript internet-explorer-9 ecmascript-5

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>

我错过了什么吗?我使用的是 Internet Explorer 9.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); 
}

最佳答案

在 JavaScript 中,有本地对象宿主对象。通常,您可以依赖像 Object.keys 这样的东西来处理本地对象,而不是宿主对象。 windowdocument 等都是宿主对象。 IE 尤其以其宿主对象不是原生的而闻名(宿主函数没有 callapply 功能等)。

当然,也可能是 document 没有可枚举 属性。对象的大多数默认属性都是不可枚举的,因此不会出现在 Object.keys 中。例如,Object.keys([]).lengthObject.keys(new RegExp(".*")).length 都是 0 因为它们都没有任何可枚举的属性,尽管它们都有很多属性(它们有所有“方法”的属性,当然空白数组有一个长度 属性和 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,只是 window.document 默认情况下没有任何可枚举 属性。 (相比之下,在 Chrome 上,我一开始有 65 个可枚举属性,当然,一旦我添加了 expando,就有 66 个。)

这是一个更完整的测试页 ( live copy )(很快拼凑在一起,不是很漂亮):

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

};

关于javascript - Object.keys() 在 Internet Explorer 9 中是否适用于内置对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6356722/

相关文章:

javascript - 使用 JQuery,如何停止向上传播 DOM 的单击事件?

Javascript:添加 '<' 似乎会破坏 html

css - 表单 CSS 仅在 IE9 上不起作用?

javascript - 是否可以确定使用 Object.create 创建的对象是否继承自 JavaScript 中的 Array?

javascript - ECMAScript 关联数组到对象/原型(prototype)为空?

javascript - ember - 关闭操作会导致错误,除非在组件中提供操作,否则不会呈现页面

javascript - 在 vis javascript 库中,如何从其节点 ID 获取节点?

javascript - javascript匿名函数的内容

IE9 中的 JavaScript 错误 :- SCRIPT5022: DOM Exception: INVALID_CHARACTER_ERR (5)

javascript - JavaScript 中的类型转换