2015-07-24 5 views
27

C# 6.0 wurde gerade veröffentlicht und hat ein neues nettes kleines Feature, das ich wirklich gerne in JavaScript verwenden würde. Sie heißen Null-conditional operators. Diese verwenden eine ?. oder ?[] Syntax.Null bedingte Operatoren

Mit diesen Funktionen können Sie im Wesentlichen überprüfen, ob das Objekt, das Sie haben, nicht null ist, bevor Sie versuchen, auf eine Eigenschaft zuzugreifen. Wenn das Objekt null ist, erhalten Sie stattdessen null als Ergebnis Ihres Eigentumszugriffs.

int? length = customers?.Length; 

Also hier int kann null sein, und wird diesen Wert nehmen, wenn customers null ist. Was ist noch besser ist, dass man diese Kette:

int? length = customers?.orders?.Length; 

Ich glaube nicht, dass wir dies in JavaScript tun, aber ich frage mich, was ist der sauberste Weg, um etwas ähnliches zu tun. Im Allgemeinen finde ich if Blöcke schwer zu lesen Verkettungs:

var length = null; 
if(customers && customers.orders) { 
    length = customers.orders.length; 
} 
+9

Lassen Sie uns einige JavaScript-Engine neu zu schreiben! – JNYRanger

+1

Related: http://stackoverflow.com/questions/476436/is-there-a-null-coalescing-operator-in-javascript – poke

+4

Sie könnten 'var Länge = Kunden && customers.orders && customers.orders.length'; – xanatos

Antwort

5

Als "optionale Verkettung" bezeichnet, ist es derzeit ein TC39-Vorschlag in Stage 1. A Babel plugin ist jedoch bereits in v7 verfügbar.

Beispiel Nutzung:

const obj = { 
    foo: { 
    bar: { 
     baz: 42, 
    }, 
    }, 
}; 

const baz = obj?.foo?.bar?.baz; // 42 

const safe = obj?.qux?.baz; // undefined 
+0

Danke für das Teilen dieses Brent - das ist großartig! – Ian

10

Js logische Operatoren geben nicht true oder false, aber truly oder falsy Wert selbst. Zum Beispiel in Ausdruck x && y, wenn x ist falsch, dann wird es zurückgegeben, sonst y wird zurückgegeben. Die Wahrheitstabelle für den Operator ist also korrekt.

In Ihrem Fall könnten Sie Ausdruck customers && customers.orders && customers.orders.Length verwenden, um length Wert oder die erste falsy eins zu erhalten.

Sie können auch etwas Magie wie ((customers || {}).orders || {}).length tun (Ich persönlich nicht Syntax mögen und möglich Garbage Collection Druck als auch)

Oder sogar maybe Monade verwenden.

function Option(value) { 
    this.value = value; 
    this.hasValue = !!value; 
} 

Option.prototype.map = function(s) { 
    return this.hasValue 
     ? new Option(this.value[s]) 
     : this; 
} 

Option.prototype.valueOrNull = function() { 
    return this.hasValue ? this.value : null; 
} 

var length = 
    new Option(customers) 
     .map("orders") 
     .map("length") 
     .valueOrNull(); 

Es ist länger als alle bisherigen Ansätze, aber zeigt deutlich Ihre Absichten ohne Magie hinter sich.

+0

Danke - ich könnte, aber was ich ' Ich möchte versuchen, etwas zu tun, das weniger ausführlich ist. – Ian

+0

@Ian, vielleicht, gibt es etw in dieser wirklich langen [Liste] (https://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-compile-to-JS) mit 'null-coalesce 'Betreiber und js Abwärtskompatibilität. Ich habe auf Typenscript gehofft, aber es gibt noch keine Unterstützung. Kaffee-Skript hat 'elvis-operator', aber seine Syntax und sein Paradigma sind zu verschieden von js. – Vladislav

+0

@Ian, fügte eine weitere Option in meiner Antwort hinzu. – Vladislav