2015-07-24 7 views
27

C# 6.0 został właśnie wydany i ma nową, ciekawą funkcję, której bardzo chciałbym użyć w JavaScript. Nazywają się Null-conditional operators. Używają one składni ?. lub ?[].Null Conditional Operators

To, co robią, pozwala zasadniczo sprawdzić, czy dany obiekt nie jest null, przed próbą uzyskania dostępu do usługi. Jeśli obiektem jest null, otrzymasz null jako wynik dostępu do właściwości.

int? length = customers?.Length; 

Więc int może być null, i weźmie tę wartość, jeśli customers jest null. Co jest jeszcze lepsze jest to, że można je łańcuch:

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

Nie wierzę, możemy to zrobić w JavaScript, ale zastanawiam się, co jest neatest sposób zrobić coś podobnego. Generalnie uważam łańcuchowym if blokuje trudne do odczytania:

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

Załóżmy przepisać niektóre silniki JavaScript! – JNYRanger

+1

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

+4

Możesz "var length = customers && customers.orders && customers.orders.length'; – xanatos

Odpowiedz

5

Zwane "opcjonalnym łańcuchem", obecnie jest to propozycja TC39 w wersji Stage 1. A Babel plugin jest jednak już dostępny w wersji 7.

Przykład użycia:

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

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

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

Dzięki za udostępnienie tego Brenta - to jest niesamowite! – Ian

10

Js operatory logiczne nie powrócić true lub false, ale truly lub wartość samego falsy. Na przykład w wyrażeniu x && y, jeśli x jest falsy, to zostanie zwrócone, w przeciwnym razie zostanie zwrócone y. Tak więc tabela prawdy dla operatora jest poprawna.

W twoim przypadku możesz użyć wyrażenia customers && customers.orders && customers.orders.Length, aby uzyskać wartość length lub pierwszą wartość .

Ponadto można zrobić jakąś magię jak ((customers || {}).orders || {}).length (Osobiście nie podoba składni i możliwą presję zbierania śmieci, jak również)

Albo nawet wykorzystać maybe monady.

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(); 

Jest dłuższy niż wszystkie poprzednie podejścia, ale wyraźnie pokazuje twoje intencje bez żadnej magii.

+0

Dzięki - mogłem, ale co ja? Chciałbym spróbować dostać się do czegoś, co jest dużo mniej gadatliwe. – Ian

+0

@Ian, być może jest coś w tej naprawdę długiej [liście] (https://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-compile-to-JS) z 'null-coalesce 'operator i js kompatybilność wsteczna. Miałem nadzieję na skrypt typu, ale nie ma jeszcze wsparcia. skrypt kawowy ma "elvis-operator", ale jego składnia i paradygmat są zbyt różne od js. – Vladislav

+0

@Ian, dodano jeszcze jedną opcję w mojej odpowiedzi. – Vladislav

Powiązane problemy