这不是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;
答案 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's和Matt Burland's评论不成立,正如我想象的那样@YeWhoseNameCantBeAtted发现了。您可以添加for... in
指令以使用标准for
,但在此用例中您仍会获得for (i=0;...)
。