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

时间:2016-05-10 20:40:19

标签: javascript jslint

这不是JSlint: unexpected 'for'的重复 ,请不要这样标记:

没有用于循环遍历对象或对象字面值的native for循环(我知道数组有.forEach。)

为什么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;

2 个答案:

答案 0 :(得分:1)

我相信您所寻找的答案与您所关联问题的已接受答案相关联:http://www.jslint.com/help.html#forin

  

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

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

  

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

     

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

for (name in object) {
    if (object.hasOwnProperty(name)) {
        ....
    }
}
     

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

答案 1 :(得分:1)

我不太确定你的意思“但这似乎是一个更长的方法。”由于你要删除DATEDIFF支票,实际上,它在某些方面更加清晰。

这是经过修改的版本that lints

hasOwnProperty

(我对多个返回值有轻微的厌恶,但是编辑它以使用它们更接近原始的匹配。并且它摆脱了我在/*jslint browser */ /*global Pub */ // on a truthy match returns true and breaks from loop Pub.someKey = function (obj, func, con) { "use strict"; if (Pub.isFunction(func)) { Object.keys(obj).forEach(function (key) { if (func.call(con, obj[key], key, obj)) { return true; } }); } return false; }; Pub.forSomeKey = Pub.someKey; 中提到的“没有中断{​​{1}}”问题原文。)

有关JSLint不喜欢forEach的原因的更多信息,请参阅this Crockford video Setzer22链接(this question)。有趣的是观看,并提供更多关于他不喜欢for的原因的背景:

  

我从来没有喜欢过for... in,因为它通过原型挖掘了那个愚蠢的东西,你得到了你不想要的所有方法和东西。所以现在我们得到了for... in,它返回了一系列东西而你没有得到挖泥船,然后将它传递给Object.keys及其兄弟,它的效果很好。所以我不再使用forEach

额外提示:在录制时以0.5的速度观看Crockford 搞笑,至少持续几分钟。

旁白:不幸的是,@Oriol'sMatt Burland's评论不成立,正如我想象的那样@YeWhoseNameCantBeAtted发现了。您可以添加for... in指令以使用标准for,但在此用例中您仍会获得for (i=0;...)