2015-07-24 16 views
27

C# 6.0 yeni piyasaya sürüldü ve JavaScript'te kullanmaktan hoşlandığım yeni bir küçük özellik var. Onlar Null-conditional operators denir. Bunlar, bir ?. veya ?[] sözdizimini kullanır.Boş Koşullu Operatörler

Bunlar, bir nesneye erişmeye çalışmadan önce sahip olduğunuz nesnenin null olmadığını kontrol etmenize izin verir. Nesne null ise, mülk erişiminizin sonucu olarak null alırsınız.

int? length = customers?.Length; 

Yani burada int boş olabilir ve customers, null ise değer alacaktır. Ne daha da iyi zincir olmasıdır şu:

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

Biz JavaScript yapabilirsiniz inanmıyorum ama benzer bir şey yapmanın etkileyicisi yolu merak ediyorum. Genellikle güç if blok okuma zincirleme olacaktır:

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

en bazı JavaScript motorları yeniden yazılmalı! – JNYRanger

+1

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

+4

"Var uzunluk = müşteri && müşteriler.nizanlar && customers.orders.length"; – xanatos

cevap

5

"İsteğe bağlı zincirleme" denir, şu anda Stage 1 numaralı TC39 teklifi. Ancak bir Babel plugin v7'de zaten mevcuttur.

Örnek kullanım:

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

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

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

Bunu paylaştığınız için teşekkürler Brent - bu harika! – Ian

10

Js mantıksal operatörler true veya false ancak truly veya falsy değer kendisi döner. Örneğin, x && y ifadesinde, x falsy ise, aksi takdirde y döndürülecektir. Böylece operatör için doğruluk tablosu doğrudur.

Sizin durumunuzda, length değerini veya ilk falsy değerini almak için customers && customers.orders && customers.orders.Length ifadesini kullanabilirsiniz.

Ayrıca ((customers || {}).orders || {}).length (Şahsen ben sözdizimi ve de mümkün çöp toplama basıncını sevmiyorum)

Hatta maybe monad kullanmak gibi bazı büyü yapabilir.

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

O arkasında herhangi büyü olmadan niyetlerinizi gösterir açıkça tüm önceki yaklaşımların daha uzun, ama.

+0

Teşekkürler - Yapabilirim ama ne' denemek ve yapmaktan hoşlanmak, daha az verbose olan bir şeye ulaşmaktır. – Ian

+0

@Ian, belki, orada gerçekten uzun [liste] (https://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-compile-to-JS) ile null-coalesce var operatör ve js geriye dönük uyumluluk. Ben tip komut dosyası için umut var, ama henüz destek yok. kahve betiğinin elvis-operatörü vardır, ancak sözdizimi ve paradigması js'den çok farklıdır. – Vladislav

+0

@Ian, cevabımda bir seçenek daha ekledi. – Vladislav