为什么 Object.keys() 和 for ..在不同的

Why are Object.keys() and for ... in different?

本文关键字:for Object keys 为什么      更新时间:2023-09-26

我正在尝试做一些浏览器对象发现,找出浏览器内置等...

在尝试获取窗口对象的属性时,我注意到了不同的结果(仅供参考,我使用的是 Chrome 版本 41.0.2272.89(64 位))。

Object.keys(window).length;

返回 7 个密钥。从文档中 Object.keys() 返回对象的可枚举属性。

但文档还说,for ... in迭代对象的可枚举属性。然而:

    var i = 0;
    for (var propertyName in window) {
        i++;
    }

返回计数 177。

为什么会有所不同?它们不应该只返回可枚举属性的计数吗?

for-in循环对象自己的可枚举属性及其原型(及其原型等)的可枚举属性。 Object.keys仅列出对象自己的可枚举属性。

所以Object.keys构建一个这样的数组

var keys = [];
var key;
for (key in object) {
    if (object.hasOwnProperty(key)) { // But using an internal, non-overrideable
                                      // operation, not literally the method
        keys.push(key);
    }
}

请注意hasOwnProperty检查(它不是对方法的真正调用,而是无法通过替换方法或类似方法来欺骗的内部检查)。