为什么Object.keys()和for...in不同?

8

我正在尝试进行一些浏览器对象的发现,弄清楚浏览器内置等信息...

我注意到在获取window对象属性时会得到不同的结果(仅供参考,我使用的是Chrome Version 41.0.2272.89 (64-bit))。

Object.keys(window).length;

返回 7 个键。从文档中可以看到,Object.keys() 函数返回对象的可枚举属性。

但是文档还指出,for ... in 循环遍历对象的可枚举属性。然而:

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

返回数量为177。

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


7
for...in 循环遍历原型属性, Object.keys 只遍历自身属性。 - elclanrs
1个回答

16

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检查(它不是真正的方法调用,而是内部检查,无法通过替换方法或类似方式来欺骗)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接