Ist ein, wenn sie mit einem ein gutes Muster weiterhin übermäßige Verschachtelung zu verhindern, während über Eigenschaften in Javascript Iterieren?
-
04-10-2019 - |
Frage
ich normalerweise verwende dieses Muster zu iterieren Objekteigenschaften:
for(var property in object) {
if(object.hasOwnProperty(property)) {
...
}
}
Ich weiß nicht, wie diese übermäßige Vertiefung und vor kurzem wurde es mir darauf hingewiesen, dass ich es bekommen konnte los, indem dies zu tun:
for(var property in object) {
if(!object.hasOwnProperty(property)) {
continue;
}
...
}
Ich mag das, weil es nicht die zusätzliche Ebene der Vertiefung einführt. Ist das Muster in Ordnung, oder gibt es bessere Möglichkeiten?
Lösung
Ich persönlich bevorzugen:
for(var property in object) if(object.hasOwnProperty(property)) {
...
}
Es gibt keine zusätzliche Ebene der Einbuchtung weil for
, if
usw. die nächste Anweisung übernehmen, wenn Sie die geschweiften Klammern auslassen. Da wir alle unsere Code innerhalb des if hasOwnProperty
Block setzen macht es keine Klammern für die for
Anweisung nicht erforderlich.
Im Wesentlichen ist es gleichbedeutend mit:
for(var property in object) {
if(object.hasOwnProperty(property)) {
...
} else {
continue;
}
}
Andere Tipps
syntaktisch ich so etwas wie dies lieber
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
}
Sieht gut aus, aber es bringt zwei Schleifen über das gleiche Objekt, nicht recht Leistung klug.
Der andere Weg, es zu tun ist functionaly
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
});
Nur eine Schleife, sondern eine Funktion wird für jede Iteration genannt, die nicht große Leistung klug ist, aber besser als die letzte Lösung. Beachten Sie, dass es clobbers auch den Wert von this
, aber Sie können diesen Wert explizit als optionales drittes Argument übergeben.
Nur ein paar Alternativen. Die Art und Weise Sie es tun, und die Art und Weise von Daniel erklärt ist ganz gut, und ohne die Leistung Kompromisse.
Außerdem würde Ich mag darauf hinweisen, dass Sie dies nicht tun Haben Code für jede einzelne geschweifte Klammer einrücken ...
Ein Faktor hängt davon ab, ob Sie nach Douglas Crockford hören. In seinem Buch JavaScript. The Good Parts, er Klumpen continue
in der schlecht Teilen
„Ich habe noch nie ein Stück Code gesehen, der nicht durch sie verbessert wurde Refactoring die Aussage weiter zu entfernen.“ - Douglas Crockford, JavaScript: The Good Parts
Wie Tim unten in seinem Kommentar erwähnt, gibt Crockford keinen Grund, in dem Buch zu erklären, warum continue
vermieden werden sollte. Aber auf seiner Website er sagt: „Es neigt dazu, den Steuerfluss zu verschleiern die Funktion." Ich erwähne nur Crockford Meinung, da viele ihn betrachten eine Autorität.
Persönlich sehe ich kein Problem mit, wie Sie Ihre Schleife codiert haben, zumal die continue
ganz oben angezeigt, in dem es nicht leicht übersehen werden. Arbeiten Sie mit einem Team von Entwicklern? Haben sie ein gutes Verständnis von dem, was continue
tut? Haben Sie eine Code-Konventionen Dokument, das spricht darüber, wie tief Verschachtelung von Aussagen zu behandeln?
Mcconnel:
Eine Schleife mit vielen Pausen kann darauf hindeuten, unklares Denken über die Struktur der Schleife oder seine Rolle in der umgebenden Code. übermäßige Pausen hebt zeigt oft, dass die Schleife werden mehr konnte eindeutig als ausgedrückt Reihe von Schleifen. Die Nutzung Pause eliminiert die Möglichkeit der Behandlung eine Schleife als Blackbox. Kontrolle ein Schleife der Austrittsbedingung mit einer Anweisung Ihre Loops zu vereinfachen. ‚Bruch‘ Kräfte der Person der Lektüre Ihrer Code zu Blick ins Innere zu verstehen, die Schleife der Steuerung, so dass die Schleife mehr schwer zu verstehen.
Dijkstra:
Funktionen wie Pause neigen dazu, Sabotage die Vorteile von strukturierten Programmierung und verhindern, dass die Programmierer aus dem Verständnis der Programm als eine Zusammensetzung von unabhängige Einheiten
Loops mit weiterhin in dieser Form berücksichtigt werden und somit kann die Schleife als Blackbox behandelt werden. Crawford ist falsch. Breaks riechen, aber weiterhin gut ist.
weitere Analyse: http://sites.google.com/site / dustingetz / dev / Pause-and-continue