Dies ist eine ziemlich allgemeine Frage. Funktional-Stil-Programmierung fördert die Idee, dass ein Programm über die Transformation von Daten durch Funktionen ist, und dass Mutation vermieden werden sollte (außer möglicherweise innerhalb einer Funktion, als eine grundlegende Einheit der Abstraktion gesehen).JavaScript im funktionalen Stil: Gute Praxis, um eine Argumentation zu vermeiden?
Aber in diesem Programm:
function foo (bar) {
bar.k1 = "bananas";
return bar;
}
var o = { k1: "apples", k2: "oranges"};
var p = foo(o);
die externe Variable o innerhalb foo mutiert ist, weil bar ein Verweis auf o ist, und am Ende, o === p
(sie das gleiche Objekt verweisen). Aber das funktionale Paradigma würde eher erwarten, dass p frische Daten sind.
Die offensichtliche Lösung ist das Argument zu klonen (e g Strich/lodash der _.clone
verwenden..):
function foo (_bar) {
var bar = _.clone(_bar);
bar.k1 = "bananas";
return bar;
}
Aber ich frage mich, ob dies der richtige Weg ist, um dieses Problem zu denken. Würden Sie es in einer FP-Perspektive für eine gute Praxis halten, die als Argumente übergebenen Objekte zu klonen, wenn sie mutiert werden? (Ich bin mir bewusst, dass nicht alle Objekte leicht geklont werden können, wenn überhaupt, aber bleiben wir bei einfachen Fällen). Ihre Gedanken?
Meine 2 Cent ist Code zu schreiben, der mit der Sprache funktioniert und nicht auf Programmiertechniken hängen bleibt. Funktionale Programmierung ist gut und schön, aber wenn Sie kein neues Objekt benötigen, gibt es keinen Grund, einen zurückzugeben, wenn Sie nur das Original ändern können. – adeneo
Ich muss das Objekt zurückgeben, wenn ich etwas tun möchte: 'someOtherFunction (foo (o))'. Was Sie wahrscheinlich meinen, ist, dass es egal ist, ob dies ein frisches Objekt oder eine Referenz auf das externe Objekt ist. –
Ob es zählt oder nicht, liegt an Ihnen? Benötigen Sie das ursprüngliche Objekt unverändert, wenn es keinen Grund gibt, ein neues Objekt zu erstellen, geben Sie einfach dasjenige Objekt zurück, das nach der Änderung an die Funktion übergeben wurde. – adeneo