Apakah ada null
operator properti akses -safe (propagasi nol / keberadaan) di ES6 (ES2015 / JavaScript.next / Harmony) seperti ?.
di CoffeeScript misalnya? Atau apakah direncanakan untuk ES7?
var aThing = getSomething()
...
aThing = possiblyNull?.thing
Ini kira-kira akan seperti:
if (possiblyNull != null) aThing = possiblyNull.thing
Idealnya solusinya tidak boleh menetapkan (datar undefined
) aThing
jika possiblyNull
adanull
if( obj?.nested?.property?.value )
alih-alihif( obj && obj.nested && obj.nested.property && obj.nested.property.value )
var appConfig = loadConfig(config, process.env); connect(appConfig.database);
denganconnect(config)
. Anda dapat melewati objek yang lebih sederhana untukconnect
bukan lewat seluruhconfig
objek, Anda dapat menggunakanconf.username
,conf.password
bukan mencoba sesuatu seperticonfig[process.env]?.database?.username
,config[process.env]?.database?.password
. Referensi: Hukum Demeter .loadConfig
contoh di atas), Anda dapat membuat asumsi tentang keberadaan properti dan melewatkan pemeriksaan nol di area tak terhitung dari aplikasi Anda.Jawaban:
Pembaruan (2020-01-31): Sepertinya orang masih menemukan ini, inilah kisahnya saat ini:
Pembaruan (2017-08-01): Jika Anda ingin menggunakan plugin resmi, Anda dapat mencoba alpha build Babel 7 dengan transformasi baru. Jarak tempuh Anda mungkin beragam
https://www.npmjs.com/package/babel-plugin-transform-optional-chaining
Asli :
Fitur yang mencapai yang saat ini dalam tahap 1: Chaining Opsional.
https://github.com/tc39/proposal-optional-chaining
Jika Anda ingin menggunakannya hari ini, ada plugin Babel yang menyelesaikannya.
https://github.com/davidyaha/ecmascript-optionals-proposal
sumber
street = user.address?.street
akan diaturstreet
dalam hal apa pun?Street
Saya pikir akan ditugaskanundefined
. Tapi setidaknya itu tidak mau mencoba mengakses properti di undefined.=
, sepertinya itu tidak didukung dalam spesifikasi resmi saat ini. github.com/tc39/proposal-optional-chaining#not-supportedIni tidak sebaik? operator, tetapi untuk mencapai hasil yang serupa dapat Anda lakukan:
Karena
null
danundefined
keduanya nilai-nilai palsu ( lihat referensi ini ), properti setelah&&
operator hanya diakses jika presedennya tidak nol atau tidak terdefinisi.Atau, Anda dapat menulis fungsi seperti ini:
Pemakaian:
Atau, dengan nilai cadangan:
sumber
!(user && user.address && user.address.postcode)
:)foo && foo.bar && foo.bar.quux ...
dalam basis kode besar ini jelek dan menambahkan banyak kerumitan yang sebaiknya Anda hindari._get<T>(func: () => T, fallbackValue?: T) :T
user.address.postcode
tidak terdefinisi,_try(() => user.address.postcode, "")
akan kembaliundefined
bukan""
. Jadi kodenya_try(() => user.address.postcode, "").length
akan memunculkan eksepsi.Tidak. Anda dapat menggunakan lodash # get atau sesuatu seperti itu untuk ini dalam JavaScript.
sumber
lodash.get
sedikit berbeda dalam obi yang tidak dapat melakukan tugas bersyarat.Alternatif vanila untuk akses properti aman
Tugas bersyarat yang paling ringkas mungkin adalah ini
sumber
possiblyNull
tidak ditentukan /null
?||=
(((a.b || {}).c || {}).d || {}).e
. Tetapi akan lebih tepat((((a || {}).b || {}).c || {}).d || {}).e
Tidak, tidak ada operator propagasi nol di ES6. Anda harus menggunakan salah satu pola yang dikenal .
Anda mungkin dapat menggunakan destrrukturisasi, meskipun:Ada banyak diskusi (misalnya ini ) untuk menambahkan operator seperti itu di ES7, tetapi tidak ada yang benar-benar berjalan.
sumber
aThing = possiblyNull.thing
null
. Anda harus memberikan nilai default, cukup banyak seperti pola ini tetapi dengan sintaks yang lebih membingungkan.Pergi dengan daftar di sini , saat ini tidak ada proposal untuk menambahkan traversal aman ke Ecmascript. Jadi tidak hanya tidak ada cara yang baik untuk melakukan ini, tetapi itu tidak akan ditambahkan di masa mendatang.
sumber
sumber
Chaining Opsional
?.
dan Penggabungan Nullish??
Anda sekarang dapat langsung menggunakan
?.
inline untuk menguji keberadaan dengan aman. Semua browser modern mendukungnya.??
dapat digunakan untuk menetapkan nilai default jika tidak terdefinisi atau nol.Jika ada properti,
?.
lanjutkan ke pemeriksaan berikutnya, atau mengembalikan nilai yang valid. Kegagalan akan segera terjadi korsleting dan kembaliundefined
.Untuk memastikan nilai standar yang ditentukan, Anda dapat menggunakan
??
. Jika Anda membutuhkan nilai kebenaran pertama, Anda dapat menggunakannya||
.Jika Anda tidak memeriksa kasus, properti sisi kiri harus ada. Jika tidak, itu akan melempar pengecualian.
?.
Dukungan Browser - 78%, Juli 2020??
Dukungan Browser - 78%Dokumentasi Mozilla
-
Penugasan nullish yang logis, solusi 2020+
Operator baru sedang ditambahkan ke browser
??=
,,||=
dan&&=
. Mereka tidak melakukan apa yang Anda cari, tetapi dapat menghasilkan hasil yang sama tergantung pada tujuan kode Anda.??=
memeriksa apakah sisi kiri tidak terdefinisi atau nol, korsleting jika sudah ditentukan. Jika tidak, sisi kiri diberi nilai sisi kanan.||=
dan&&=
serupa, tetapi didasarkan pada||
dan&&
operator.Contoh dasar
Contoh Obyek / Array
Dukungan Browser Juli 2020 - .03%
Dokumentasi Mozilla
sumber
?.
dan??
, dan solusi mendatang yang terperinci yang mungkin cocok untuk situasi Anda. Solusi terbaik saat ini mungkin hanya lakukanaThing = possiblyNull?.thing ?? aThing
Metode deep deep get sepertinya cocok untuk underscore.js tetapi ada masalah menghindari pemrograman string. Memodifikasi jawaban @ Felipe untuk menghindari pemrograman string (atau setidaknya mendorong kasus tepi kembali ke pemanggil):
Contoh:
sumber
_.get(obj, array_or_dotstring)
obj.a.b.c
vsobj['a']['b']['c']
keys
datangnya?Saya tahu ini adalah pertanyaan JavaScript, tapi saya pikir Ruby menangani ini dengan semua cara yang diminta, jadi saya pikir itu adalah titik referensi yang relevan.
.&
,,try
& && memiliki kekuatan dan potensi jebakan mereka. Hebatnya opsi di sini: http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/TLDR; Kesimpulan Rubyists adalah bahwa
dig
lebih mudah di mata dan jaminan yang lebih kuat bahwa nilai ataunull
akan diberikan.Berikut ini adalah penerapan sederhana dalam TypeScript:
Ini dapat digunakan untuk setiap kedalaman fungsi persarangan dan pegangan.
The
try
pendekatan adalah sama-sama baik untuk membaca di JS, seperti yang ditunjukkan dalam jawaban sebelumnya. Ini juga tidak memerlukan perulangan, yang merupakan salah satu kelemahan dari implementasi ini.sumber
Saya pikir pertanyaan ini membutuhkan sedikit penyegaran untuk tahun 2018. Ini dapat dilakukan dengan baik tanpa menggunakan perpustakaan
Object.defineProperty()
dan dapat digunakan sebagai berikut:Saya menganggap ini aman (dan js-etika) karena
writeable
danenumerable
definisi sekarang tersedia untukdefineProperty
metodeObject
, seperti yang didokumentasikan dalam MDNdefinisi fungsi di bawah ini:
Saya telah mengumpulkan jsBin dengan output konsol untuk menunjukkan ini. Perhatikan bahwa dalam versi jsBin saya juga menambahkan pengecualian khusus untuk nilai kosong. Ini opsional, jadi saya tidak menggunakan definisi minimal di atas.
Perbaikan disambut
sumber