对对象(而不是数组)使用 for 循环的替代方法是什么?为什么?

5 javascript jslint

这不是JSlint 的重复:意外的 'for' ,请不要将其标记为:

没有用于循环对象或对象文字的本机 for 循环(我知道有一个.forEachfor 数组)。

为什么 jslint 建议不要使用 for 循环?你如何遍历一个对象不具有Array.forEach()Array.some()或类似的?

但更大更重要的问题是,为什么提出这个建议?

显然我可以使用Object.keys()然后,forEach()但这似乎是一种更长的方法。

源代码

// on a truthy match returns true and breaks from loop
Pub.someKey = function (obj, func, con) {
    var key;
    if (!Pub.isFunction(func)) {
        return false;
    }
    for (key in obj) {
        if (obj.hasOwnProperty(key)) {
            if (func.call(con, obj[key], key, obj)) {
                return true;
            }
        }
    }
    return false;
};
Pub.forSomeKey = Pub.someKey;
Run Code Online (Sandbox Code Playgroud)

Jac*_* A. 3

我相信您正在寻找的答案链接在您链接的问题的接受答案中: http: //www.jslint.com/help.html#forin

不建议使用 for in 语句。请改用 Object.keys。

它继续解释为什么建议这样做。

for in 语句允许循环遍历对象的所有属性的名称。不幸的是,它还循环遍历通过原型链继承的所有属性。当兴趣在于数据属性时,这会产生提供方法函数的不良副作用。如果在没有意识到这种情况的情况下编写程序,那么它可能会失败。

每个 for in 语句的主体都应该包含在执行过滤的 if 语句中。它可以选择特定类型或值范围,或者可以排除函数,或者可以从原型中排除属性。例如,

for (name in object) {
    if (object.hasOwnProperty(name)) {
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果对象包含名为 hasOwnProperty 的数据属性,则上述代码将失败。请改用 Object.keys。