Anda tidak dapat melakukannya di switch
kecuali Anda melakukan pencocokan string penuh ; itu melakukan pencocokan substring . (Ini tidak cukup benar, seperti yang ditunjukkan Sean dalam komentar. Lihat catatan di bagian akhir.)
Jika Anda senang bahwa regex Anda di atas menghilangkan semua yang tidak ingin Anda bandingkan dalam pertandingan Anda, Anda tidak perlu pertandingan substring, dan dapat melakukan:
switch (base_url_string) {
case "xxx.local":
// Blah
break;
case "xxx.dev.yyy.com":
// Blah
break;
}
... tapi sekali lagi, itu hanya berfungsi jika itu adalah string lengkap yang cocok dengan Anda. Itu akan gagal jika base_url_string
, katakanlah, "yyy.xxx.local" sedangkan kode Anda saat ini akan cocok dengan yang ada di cabang "xxx.local".
Pembaruan : Oke, jadi secara teknis Anda dapat menggunakan switch
pencocokan substring, tetapi saya tidak akan merekomendasikannya di sebagian besar situasi. Begini caranya ( contoh langsung ):
function test(str) {
switch (true) {
case /xyz/.test(str):
display("• Matched 'xyz' test");
break;
case /test/.test(str):
display("• Matched 'test' test");
break;
case /ing/.test(str):
display("• Matched 'ing' test");
break;
default:
display("• Didn't match any test");
break;
}
}
Itu berfungsi karena cara switch
kerja pernyataan JavaScript , khususnya dua aspek utama: Pertama, bahwa kasus dipertimbangkan dalam urutan teks sumber , dan kedua bahwa ekspresi pemilih (bit setelah kata kunci case
) adalah ekspresi yang dievaluasi sebagaimana halnya case dievaluasi (bukan konstanta seperti dalam beberapa bahasa lain). Jadi karena ekspresi pengujian kami adalah true
, case
ekspresi pertama yang menghasilkan true
akan menjadi yang digunakan.
switch(true) { case /foo/.test(bar): ....
true
sana, Anda hanya meninggalkannya bersama-sama.RegExp dapat digunakan pada string input tidak hanya secara teknis tetapi juga praktis dengan
match
metode ini.Karena output dari
match()
array, kita perlu mengambil elemen array pertama dari hasilnya. Ketika pertandingan gagal, fungsi kembalinull
. Untuk menghindari kesalahan pengecualian, kami akan menambahkan||
operator kondisional sebelum mengakses elemen array pertama dan mengujiinput
properti yang merupakan properti statis dari ekspresi reguler yang berisi string input.Pendekatan lain adalah dengan menggunakan
String()
konstruktor untuk mengkonversi array yang dihasilkan yang harus memiliki hanya 1 elemen (tidak ada grup penangkap) dan seluruh string harus ditangkap dengan quanitifiers (.*
) ke string. Dalam hal terjadi kegagalannull
objek akan menjadi"null"
string. Tidak mudah.Bagaimanapun, solusi yang lebih elegan adalah menggunakan metode
/^find-this-in/.test(str)
withswitch (true)
yang hanya mengembalikan nilai boolean dan lebih mudah untuk mencari tanpa sensitivitas case.sumber
Cukup gunakan properti location.host
sumber
switch ("" + location.host)
.Pilihan lain adalah menggunakan
input
bidang hasil pertandingan regexp :sumber
.length:
-> Jika kecocokan dibuat, ekspresi ternary mengembalikan token asli
----> Token asli dievaluasi berdasarkan kasus
-> Jika pertandingan tidak membuat pengembalian terner tidak terdefinisi
----> Case mengevaluasi token terhadap undefined yang diharapkan token Anda tidak.
Tes ternary dapat berupa apa saja misalnya dalam kasus Anda
===========================================
adalah ekspresi ternary.
Pengujian dalam kasus ini adalah token.match (/ spo /) yang menyatakan kecocokan string yang dipegang dalam token terhadap ekspresi regex / spo / (yang merupakan spo string literal dalam kasus ini).
Jika ekspresi dan string cocok dengan itu menghasilkan true dan mengembalikan token (yang merupakan string pernyataan switch beroperasi).
Jelas token === token sehingga pernyataan switch cocok dan case dievaluasi
Lebih mudah untuk dipahami jika Anda melihatnya berlapis-lapis dan memahami bahwa uji turnery dievaluasi "SEBELUM" pernyataan switch sehingga pernyataan switch hanya melihat hasil tes.
sumber
token.match(/spo/)
cocok.Mungkin lebih mudah. Cobalah untuk berpikir seperti ini:
:
sumber
TypeError: url.match(...) is null
Mungkin sudah terlambat dan semuanya, tapi saya suka tugas jaga ini :)
Anda dapat mengambilnya lebih jauh, dan memberikan daftar opsi dan menangani regex dengan |
sumber
|| {}
ke|| [-1]
atau serupa untuk jenis keamanan. Juga, mengapanew RegExp
digunakan, bukan hanya tebasan?