Wolfgang Wolf wrote:
> Am 26.09.2019 um 18:00 schrieb Thomas 'PointedEars' Lahn:
>> Wenn Du for..in-Schleifen verwendest, dann wird über alle aufzählbaren
>> Eigenschaften des Objekts und seiner Prototypen iteriert. Das solltest
>> Du vermeiden, denn Du weisst nie, welche Eigenschaften ein Objekt hat.
>
> In diesem Fall schon. Die Daten kommen immer von der gleichen Funktion,
> die diese aus einer Tabelle extrahiert.
Ausser Du kannst die Implementierungen eingrenzen, mit denen Dein Code
ausgeführt wird, weisst Du nie, welche aufzählbaren Eigenschaften ein Objekt
hat.
Siehe auch:
<
http://PointedEars.de/es-matrix>
<
https://github.com/airbnb/javascript>
In diesem Zusammenhang empfehle ich (aufgrund eigener, positiver Erfahrung)
die Verwendung von
<
https://eslint.org/>
(Die Airbnb-Empfehlungen kann man sich zurechtbiegen, wenn es gar nicht
passen sollte. Man sollte das aber nur machen, wenn man weiss, was man
tut.)
> Das geht sogar soweit, dass ich mir die String-Prüfeng auch noch sparen
> könnte. Habe das mal bei einer größeren Datenmenge getestet uns es bringt
> gefühlt gar nichts, also habe ich dieses Mindestmaß an Validierung drin
> gelassen.
Wie gesagt erbt jedes eingebaute Objekt die .toString()-Methode von
Object.prototype(), so dass man damit (explizit oder implizit) jeden Wert
nach String konvertieren kann, um dann auf dem Ergebnis
String.prototype.replace() ausführen zu können. Das heisst aber nicht, dass
das Ergebnis auch sinnvoll ist oder dass das effizient ist. Die Prüfung auf
String ist also sinnvoll.
>> Über Array-Objekte wird modern so iteriert:
>>
>> data.forEach(callback);
>
> Na ja, mit der Rückwärtsschleife haben wir die letzte ms raus geholt,
> und nun verschenken wir sie vermutlich wieder.
Nein.
> Vielleicht liege ich auch falsch,
Das tust Du insofern, als dass die Funktion nur einmal compiliert werden
muss. Inwiefern die mehrfachen Aufrufe dann mehr Laufzeit kosten, müsste
man mal ausprobieren (normalerweise sind mehrfache Funktionsaufrufe
ineffizienter, bei Callbacks kann das aber anders sein).
> aber ich kann mir nicht vorstellen, dass die Interpreter heute
> in der Lage sind so was besser zu optimieren, wie eine handgemachte
> Schleife - modern hin oder her.
Ich schon.
> Ehrlich, dieses Neumodische kotzt mich manchmal auch an. Hier werden
> -zig neue Wege geschaffen, die letzten Endes zum gleichen Ergebnis
> führen. Es gibt so ein altes Volkslied, bei dem sich immer die eine
> Zeile wiederholt: "Aber schön muss sie sein..."
Das „Neumodische“ (jetzt auch schon wieder 10 Jahre alt; ECMAScript Ed. 5
wurde 2009 veröffentlicht und 2010 mit Mozilla JavaScript 1.8.2 erstmals
implementiert) ist auf jeden Fall weniger fehlerträchtig. Sämtliche
schleifenbezogenen Variablen sind auch dann automatisch im Scope begrenzt,
wenn man nicht Block-Scoping verwendet (das gab es bei der Einführung dieser
Methoden noch nicht), nämlich dadurch dass sie lokal im Callback sind.
>> Zusammenfassend:
>>
>> data.forEach(element => {
>> Object.keys(element).forEach(function (key) {
>> let value = this[key];
>>
>> if (typeof value === 'string')
>> {
>> this[key] = value.replace(/;/g, ',');
>> }
>> }, element);
>> });
>>
>
> Und ist das jetzt schöner lesbar, als zwei ehrliche altmodische
> Schleifen?
Ja. Da steht fast wörtlich genau, was gemacht werden soll, und man muss es
nicht erst aus der Schleifenlogik erraten.
> Ist es schneller?
Ob es *insgesamt* schneller ist, weiss ich nicht. Aber die nativ in C/C++
oder Java implementierten Schleifen der Script-Engines sind *sicher*
schneller als JIT-compilierte in ECMAScript.
> Oder kompatibler?
Nein, es gibt noch uralte Implementierungen mit < 1 % weltweitem
Marktanteil, die das nicht nativ unterstützen:
<
http://pointedears.de/scripts/test/es-matrix/?filter=Array%5C.prototype%5C.forEach%7CObject%5C.keys>
Aber selbst dafür gibt es ja Babel.js & Co. oder man verwendet einen
Polyfill.
> [...]
>>
>> "Draht;sw;0,5mm²;40°C...150°C"
>>
>> sind die Daten eindeutig. Bei
>> "Draht,sw,0,5mm²,40°C...150°C"
>> (das Ergebnis Deiner Ersetzung) ist das nicht mehr der Fall (ist das
>> Komma dort ein Feldtrenner oder ist es ein Dezimalkomma?).
>
> Damit, dass in der deutschen Sprache das Dezimaltrennzeichen das gleiche
> ist wie das Nebensatztrennzeichen, damit muss unser Kulturraum leben,
> was soll's... ;-)
Das ist keine Frage der Sprache, sondern landesspezifisch. In der
deutschsprachigen Schweiz zum Beispiel, wo ich seit geraumer Zeit lebe, wird
in der Regel mindestens bei Geldbeträgen der Punkt als Dezimaltrennzeichen
verwendet:
<
https://www.bk.admin.ch/bk/de/home/dokumentation/sprachen/hilfsmittel-textredaktion/schreibweisungen.html>
Dort Abschnitt 5.1.3.
(Das war meine Referenz, als ich an <
https://www.priminfo.admin.ch/>
mitarbeitete.)
Siehe auch: <
https://de.wikipedia.org/wiki/Schreibweise_von_Zahlen>
Das Komma ist übrigens im Deutschen nicht ausschliesslich ein
„Nebensatztrennzeichen“:
<
https://www.duden.de/sprachwissen/rechtschreibregeln>
Siehe dort u.a. D11, D32, und D100 bis D132.
> Vielen Dank für deine (top) Anmerkungen und Ergänzungen.
Bitte, danke.