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

时间:2015-03-12 07:45:38

标签: javascript

我试图进行一些浏览器对象发现,搞清楚浏览器内置等...

我在尝试获取窗口对象的属性时注意到了不同的结果(仅供参考我使用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的计数。

为什么会有所不同?难道他们俩都只返回可枚举属性的数量吗?

1 个答案:

答案 0 :(得分:15)

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检查(它实际上并不是对方法的调用,而是通过替换方法或类似方法无法欺骗的内部检查)。