是否有一个持续的良好模式可以防止在JavaScript中迭代属性时过度筑巢?
-
04-10-2019 - |
题
我通常使用此模式在对象属性上迭代:
for(var property in object) {
if(object.hasOwnProperty(property)) {
...
}
}
我不喜欢这种过多的凹痕,最近向我指出,我可以这样做:
for(var property in object) {
if(!object.hasOwnProperty(property)) {
continue;
}
...
}
我喜欢这个,因为它不会引入额外的凹痕水平。这种模式还可以,还是有更好的方法?
解决方案
我个人更喜欢:
for(var property in object) if(object.hasOwnProperty(property)) {
...
}
没有额外的缩进水平,因为 for
, if
, 等等。由于我们将所有代码都放在 if hasOwnProperty
阻止它为 for
声明不必要。
从本质上讲,这相当于:
for(var property in object) {
if(object.hasOwnProperty(property)) {
...
} else {
continue;
}
}
其他提示
句法我更喜欢这样的东西
function own(obj) {
var ownprops = {};
for (var prop in obj)
if (obj.hasOwnProperty(prop)) ownprops[prop] = 1;
return ownprops;
}
for (var property in own(object)) {
//code
}
看起来不错,但是它需要在同一对象上进行两个循环,而不是明智的性能。
另一种做法是功能性的
function foreach(obj, func, thisp) {
for (var prop in obj)
if (obj.hasOwnProperty(prop)) func.call(thisp, obj[prop], prop);
}
foreach(object, function(val, key) {
//code
});
只有一个循环,但每个迭代都会调用一个函数,这不是很好的性能,而是比最后一个解决方案更好。请注意,它还抓住了 this
, ,但是您可以将该值明确传递为可选的第三参数。
只是一些替代方案。您的做法和丹尼尔(Daniel)解释的方式很好,没有表现妥协。
另外,我想指出你不 有 为每一个卷发撑杆缩进您的代码...
一个因素取决于您是否听道格拉斯·克罗克福德(Douglas Crockford)。在他的书《 JavaScript:好部分》中,他笨拙 continue
与 坏的 部分。
“我从未看到过通过重构来删除继续陈述来改进的代码。” - 道格拉斯·克罗克福德(Douglas Crockford),JavaScript:好部分
作为 蒂姆 克罗克福德(Crockford)在他的评论中提到,在书中没有理由解释为什么 continue
应该避免。但是继续 他的网站 他说:“这往往会掩盖功能的控制流。”我只提到克罗克福德的意见,因为许多人认为他是权威。
就我个人而言,我看不到您如何编码循环的任何问题,尤其是因为 continue
出现在不容易被忽视的顶部。您正在与开发人员团队合作吗?他们对什么有很好的了解 continue
做?您是否有一个代码约定文档,该文件谈论如何处理语句的深层嵌套?
麦康纳:
有很多断裂的循环可能表明对环路的结构或其在周围代码中的作用不清楚。过度断裂通常表明该循环可以更清楚地表达为一系列循环。休息的使用消除了将循环视为黑匣子的可能性。用一个语句控制环路的退出条件,以简化循环。 “打破”迫使阅读您的代码的人看内部以了解循环的控制,从而使循环更难理解。
Dijkstra:
诸如Break之类的功能倾向于破坏结构化编程的好处,并防止程序员将程序理解为独立单位的组成
具有继续的循环可以将其纳入此形式,因此可以将循环视为黑匣子。克劳福德错了。散发气味,但继续是好的。
进一步的分析: http://sites.google.com/site/dustingetz/dev/break-and-continue