Saya akan menjelaskan dengan contoh:
Operator Elvis (?:)
"Operator Elvis" adalah kependekan dari operator ternary Jawa. Salah satu contoh di mana hal ini berguna adalah untuk mengembalikan nilai 'sensible default' jika ekspresi diputuskan menjadi false atau null. Contoh sederhana mungkin terlihat seperti ini:
def gender = user.male ? "male" : "female" //traditional ternary operator usage
def displayName = user.name ?: "Anonymous" //more compact Elvis operator
Operator Navigasi Aman (?)
Operator Navigasi Aman digunakan untuk menghindari NullPointerException. Biasanya ketika Anda memiliki referensi ke objek Anda mungkin perlu memverifikasi bahwa itu tidak nol sebelum mengakses metode atau properti objek. Untuk menghindari hal ini, operator navigasi yang aman hanya akan mengembalikan nol alih-alih melemparkan pengecualian, seperti:
def user = User.find( "admin" ) //this might be null if 'admin' does not exist
def streetName = user?.address?.street //streetName will be null if user or user.address is null - no NPE thrown
javascript
jquery
groovy
safe-navigation-operator
tiagomac
sumber
sumber
??
) yang tepat dalam javascript? Semua yang saya temukan sejauh ini menunjukkan bahwa JS hanya memiliki penggabungan "falsey" (menggunakan||
).Jawaban:
Anda dapat menggunakan operator 'OR' yang logis sebagai pengganti operator Elvis:
Sebagai contoh
displayname = user.name || "Anonymous"
.Tetapi Javascript saat ini tidak memiliki fungsi lain. Saya akan merekomendasikan melihat CoffeeScript jika Anda ingin sintaks alternatif. Ini memiliki beberapa singkatan yang mirip dengan apa yang Anda cari.
Misalnya Operator yang Ada
Pintasan fungsi
Panggilan fungsi seksi
Ada juga komentar dan kelas multiline. Jelas Anda harus mengkompilasi ini ke javascript atau menyisipkan ke halaman
<script type='text/coffeescript>'
tetapi menambahkan banyak fungsi :). Penggunaan<script type='text/coffeescript'>
sebenarnya hanya ditujukan untuk pengembangan dan bukan produksi.sumber
<script type='coffee/script>'
?<script type="text/coffeescript">
.x === undefined
.Saya pikir yang berikut ini setara dengan operator navigasi yang aman, meskipun sedikit lebih lama:
streetName
maka akan menjadi nilaiuser.address.street
atauundefined
.Jika Anda ingin default ke hal lain, Anda dapat menggabungkan dengan cara pintas di atas atau memberikan:
sumber
Operator ATAU logis Javascript adalah hubungan arus pendek dan dapat menggantikan operator "Elvis" Anda:
Namun, setahu saya tidak ada yang setara dengan
?.
operator Anda .sumber
||
bisa digunakan seperti itu. Sadarilah bahwa ini akan menyatu tidak hanya ketika ekspresi adalahnull
, tetapi juga ketika itu terdefinisi,false
,0
, atau string kosong.""
atau0
mungkin tidak terduga, :)Saya kadang-kadang menemukan ungkapan berikut berguna:
dapat ditulis ulang sebagai:
Ini mengambil keuntungan dari fakta bahwa mendapatkan atribut yang tidak dikenal pada suatu objek menghasilkan undefined, daripada melemparkan pengecualian seperti pada
null
atauundefined
, jadi kami mengganti null dan undefined dengan objek kosong sebelum menavigasi.sumber
&&
metode verbose itu . +1.Saya pikir lodash
_.get()
dapat membantu di sini, seperti dalam_.get(user, 'name')
, dan tugas-tugas yang lebih kompleks seperti_.get(o, 'a[0].b.c', 'default-value')
sumber
Saat ini ada spesifikasi rancangan:
https://github.com/tc39/proposal-optional-chaining
https://tc39.github.io/proposal-optional-chaining/
Untuk saat ini, saya suka menggunakan lodash
get(object, path [,defaultValue])
atau dlvdelve(obj, keypath)
Pembaruan (per 23 Desember 2019):
sumber
Pembaruan 2019
JavaScript sekarang memiliki padanan untuk Operator Elvis dan Operator Navigasi Aman.
Akses Properti Aman
The chaining Operator opsional (
?.
) saat ini menjadi tahap 4 ECMAScript usulan . Anda dapat menggunakannya hari ini dengan Babel .The logis operator AND (
&&
) adalah "tua", cara yang lebih-verbose untuk menangani skenario ini.Memberikan Default
The Operator penggabungan nullish (
??
) saat ini menjadi tahap 3 ECMAScript usulan . Anda dapat menggunakannya hari ini dengan Babel . Ini memungkinkan Anda untuk menetapkan nilai default jika sisi kiri operator adalah nilai nullary (null
/undefined
).The Operator OR logis (
||
) merupakan solusi alternatif dengan perilaku yang sedikit berbeda . Hal ini memungkinkan Anda untuk mengatur nilai default jika sisi kiri dari operator adalah falsy . Perhatikan bahwa hasil dimyVariable3
bawah berbeda dari dimyVariable3
atas.sumber
Untuk yang pertama, bisa Anda gunakan
||
. Operator "logis atau" Javascript, alih-alih hanya mengembalikan nilai kalengan benar dan salah, mengikuti aturan mengembalikan argumen kirinya jika itu benar, dan sebaliknya mengevaluasi dan mengembalikan argumen kanannya. Ketika Anda hanya tertarik pada nilai kebenaran, hasilnya sama saja, tetapi itu juga berartifoo || bar || baz
mengembalikan nilai foo, bar, atau baz paling kiri yang berisi nilai sebenarnya .Anda tidak akan menemukan satu yang dapat membedakan false dari null, dan 0 dan string kosong adalah nilai-nilai yang salah, jadi hindari menggunakan
value || default
konstruk yangvalue
bisa bernilai 0 atau""
.sumber
Ya ada! 🍾
Chaining opsional ada di tahap 4 dan ini memungkinkan Anda untuk menggunakan
user?.address?.street
formula.Jika Anda tidak bisa menunggu rilis, instal
@babel/plugin-proposal-optional-chaining
dan Anda dapat menggunakannya. Berikut adalah pengaturan saya yang berfungsi untuk saya, atau cukup baca artikel Nimmo .sumber
Berikut ini setara dengan operator elvis:
sumber
UPDATE SEP 2019
Ya, JS sekarang mendukung ini. Chaining opsional akan segera hadir untuk v8 baca selengkapnya
sumber
Ini lebih dikenal sebagai operator penggabungan nol. Javascript tidak memilikinya.
sumber
Anda dapat mencapai efek yang hampir sama dengan mengatakan:
sumber
Saya punya solusi untuk itu, sesuaikan dengan kebutuhan Anda sendiri, kutipan dari salah satu lib saya:
bekerja seperti pesona. Nikmati sedikit rasa sakit!
sumber
Anda bisa menggulung sendiri:
Dan gunakan seperti ini:
* hasil tidak ditentukan jika salah satu dari a, b, c atau d tidak terdefinisi.
sumber
Saya membaca artikel ini ( https://www.beyondjava.net/elvis-operator-aka-safe-navigation-javascript-typescript ) dan memodifikasi solusi menggunakan Proxies.
Anda menyebutnya seperti ini:
Hasilnya akan tidak ditentukan untuk ekspresi yang menemukan nol atau tidak terdefinisi di sepanjang jalurnya. Anda bisa menjadi liar dan memodifikasi prototipe Obyek!
sumber
Melompat sangat terlambat, ada proposal [1] untuk chaining opsional saat ini pada tahap 2, dengan plugin babel [2] tersedia. Saat ini tidak ada di browser apa pun yang saya ketahui.
sumber
Ini masalah bagi saya untuk waktu yang lama. Saya harus datang dengan solusi yang dapat dengan mudah dimigrasi begitu kita mendapatkan operator Elvis atau sesuatu.
Inilah yang saya gunakan; bekerja untuk array dan objek
letakkan ini di file tools.js atau apalah
contoh penggunaan:
Yah aku tahu itu membuat kode sedikit tidak terbaca tetapi itu adalah solusi satu liner sederhana dan berfungsi dengan baik. Saya harap ini membantu seseorang :)
sumber
Ini adalah solusi menarik untuk operator navigasi yang aman menggunakan beberapa campuran ..
http://jsfiddle.net/avernet/npcmv/
sumber
Saya membuat paket yang membuat ini jauh lebih mudah digunakan.
NPM jsdig Github jsdig
Anda dapat menangani hal-hal sederhana seperti dan objek:
atau sedikit lebih rumit:
sumber
Secara pribadi saya menggunakan
dan misalnya aman dapatkan:
sumber
e({a:{b:{c:{d:'test'}}}}, 'a.b.c.d')
pengembaliannull
.e = eval
,var a = eval('obj.a.b.c.d')
.eval
bahkan tidak mengambil parameter kedua ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…