JavaScript hat eine (neuartige) Funktion namens optional chaining. Angenommen, ich habe Code wie
const name = Data.person.name;
Wenn person in Data zufällig nicht existiert, erhalte ich einen harten, stoppenden Fehler. Mit optionalem Chaining kann ich schreiben:
const name = Data.person?.name;
Wenn person nicht existiert, wird name zu undefined, anstatt einen Fehler auszulösen. Das ist meiner Meinung nach ziemlich nützlich. In gewisser Weise macht es den Code widerstandsfähiger, da die Möglichkeit, dass ein Skript komplett abstürzt, geringer ist. Es gibt jedoch auch Argumente dafür, dass es den Code tatsächlich weniger widerstandsfähig macht, da man das Problem an der Wurzel behebt (schlechte Daten), anstatt ein Pflaster aufzukleben.
Jim Nielsen stellt die Verbindung zum optionalen Chaining und !important in CSS her. Fehler wegen "undefined properties" sind vielleicht die häufigsten aller JavaScript-Fehler und optionales Chaining ist eine schnelle Umgehung. Stile, die nicht wie gewünscht kaskadieren, sind (vielleicht?) die häufigsten aller CSS-Probleme und !important ist eine schnelle Umgehung.
Wer mit CSS vertraut ist, weiß, dass die Verwendung von
!importantIhre Probleme nicht immer löst. Tatsächlich kann es Ihnen sogar mehr Probleme bereiten. Dasselbe gilt für optionales Chaining in JavaScript, es kann Ihnen mehr Probleme bereiten, als es löst (wir wissen es noch nicht, da es noch nicht lange genug existiert).
Diese Sichtweise gefällt mir.
Verschwommene negative Meinungen über neue Funktionen sind nur Clickbait-Unsinn, aber manchmal gibt es darin gute Gedanken zum Nachdenken. Ich wette, optionales Chaining wird sich in JavaScript in einigen schönen Mustern einfinden, so wie !important in CSS bis zu einem gewissen Grad getan hat. Das meiste Gerede, das ich in letzter Zeit über !important in CSS höre, dreht sich darum, wie man es verwenden sollte, wenn man es wirklich meint (nicht, um aus einer Klemme herauszukommen).
Ich bin mir nicht so sicher, ob das so eine große Sache ist. Im Beispiel müssen wir später, wenn wir die
name-Konstante verwenden wollen, sicherstellen, dass wir einen gültigen Wert haben. Selbst wennData.persongut ist, istData.person.namevielleicht nicht das, was wir erwarten.Also, in Zukunft, wenn wir
nameverwenden müssen und unsData.personnicht mehr kümmert, prüfen wir einfach, obnamegesetzt ist und das ist, was wir erwarten.Optionales Chaining erlaubt uns in diesem Fall, uns schnell mit der nicht existierenden Person zu befassen und uns auf den Rest unseres Tages zu konzentrieren. Allerdings benutze ich es nicht.
Ich habe darauf gewartet, dass ternäre Prüfungen weniger umständlich werden. Ich habe Fälle, in denen ich Objekte unterwegs fülle und nicht immer weiß, ob Eigenschaften bereits vorhanden sind.
Anstatt zum Beispiel
let a = b && b.c && b.c.d || 1;
Kann ich schreiben
let a = b?.c?.d || 1;
Ich glaube nicht, dass sich das für mich oder die Teams, mit denen ich arbeite, zumindest nicht ändern wird.
Ich denke, es ist generell als Best Practice verstanden, Fehlerprüfungen am Anfang einer Funktion durchzuführen, wenn nötig, und entsprechend zu reagieren. Das ändert nichts an dieser Logik oder an den Dingen, auf die wir achten müssen, es macht nur weniger zu schreiben und ist wohl leichter zu lesen.
Allerdings nutze ich diese Funktion noch nicht aufgrund der Browserunterstützung.