var reg1 = /^1$/g;
var reg2 = /^1$/;
for (var i = 0; i < 10; i++) {
console.log(reg1.test('1')) // true false true false true false true false ...
console.log(/^1$/g.test('1')) // true true true true true true true ...
console.log(reg2.test('1')) // true true true true true true true ...
console.log(/^1$/.test('1')) // true true true true true true true ...
}
Kenapa keluaran console.log pertama begini?
Apabila ungkapan biasa dilaksanakan, Indeks terakhir objek RegExp mungkin berubah.
Kaedahujian digunakan untuk mengesan sama ada rentetan sepadan dengan peraturan biasa tertentu Selagi rentetan mengandungi teks yang sepadan dengan peraturan biasa, kaedah itu akan mengembalikan benar, jika tidak, ia mengembalikan palsu.
Malah, jika ungkapan biasa mempunyai bendera global (dengan parameter g), kaedah ujian juga dipengaruhi oleh atribut lastIndex objek biasa, seperti berikut:
Impak ini akan dianalisis dalam penjelasan kaedah exec.
Kaedahexec digunakan untuk mengesan padanan rentetan dengan ungkapan biasa Jika teks yang sepadan ditemui, ia mengembalikan tatasusunan hasil, jika tidak, ia mengembalikan nol.
Sintaks: exec(rentetan)
Tatasusunan yang dikembalikan oleh kaedahexec mengandungi dua atribut tambahan, indeks dan input Dan tatasusunan mempunyai ciri-ciri berikut:
Item ke-0 mewakili teks yang ditangkap oleh ungkapan biasa
Item pertama~n mewakili rujukan belakang ke-1, yang seterusnya menghala ke teks yang ditangkap dalam kumpulan ke-1 Anda boleh menggunakan RegExp.$ + "Nombor 1~n" untuk mendapatkan teks dalam kumpulan mengikut urutan
indeks mewakili kedudukan awal rentetan yang dipadankan
input mewakili rentetan yang sedang diambil
Tidak kira sama ada ungkapan biasa mempunyai bendera global "g" atau tidak, kelakuan exec adalah sama Tetapi kelakuan objek ungkapan biasa adalah agak berbeza berbeza.
Anggap bahawa objek ungkapan biasa ialah reg, aksara yang dikesan ialah rentetan dan nilai pulangan reg.exec(rentetan) ialah tatasusunan.
Jika reg mengandungi tanda global "g", maka atribut reg.lastIndex mewakili kedudukan selepas penghujung rentetan yang dipadankan dalam rentetan asal, iaitu kedudukan di mana padanan seterusnya bermula Pada masa ini, reg.lastIndex == tatasusunan.index (padankan kedudukan Mula) + tatasusunan[0].panjang (padanan dengan panjang rentetan seperti berikut:
Apabila pengambilan diteruskan, nilai array.index akan dinaikkan, iaitu, nilai reg.lastIndex juga akan ditambah secara serentak Oleh itu, kita juga boleh melintasi semua padanan dalam rentetan dengan memanggil kaedah exec berulang kali Teks. Apabila kaedah exec tidak lagi sepadan dengan teks, ia akan mengembalikan null dan menetapkan semula sifat reg.lastIndex kepada 0.
Berikutan contoh di atas, kami terus melaksanakan kod untuk melihat sama ada perkara di atas adalah betul, seperti yang ditunjukkan di bawah:
Dalam kod di atas, kerana kaedah exec dipanggil berulang kali, sifat reg.lastIndex akhirnya ditetapkan semula kepada 0.
Semakan Masalah
Dalam penjelasan kaedah ujian, kami meninggalkan masalah Jika ungkapan biasa mempunyai bendera global g, hasil pelaksanaan kaedah ujian di atas akan dipengaruhi oleh reg.lastIndex. Bukan itu sahaja, kaedah exec juga sama. Memandangkan reg.lastIndex Nilai tidak selalunya sifar, dan ia menentukan kedudukan permulaan padanan seterusnya Jika anda ingin mula mendapatkan rentetan baharu selepas melengkapkan padanan dalam rentetan, anda mesti menetapkan semula atribut lastIndex 0. Elakkan ralat berikut:
Hasil pelaksanaan yang betul bagi kod di atas hendaklah "123456", jadi adalah disyorkan untuk menambah "reg.lastIndex = 0;" sebelum melaksanakan kaedah exec untuk kali kedua.
Jika reg tidak mengandungi bendera global "g", maka hasil pelaksanaan (tatasusunan) kaedah exec akan betul-betul sama dengan hasil pelaksanaan kaedah string.match(reg).
Snippet ini datang daripada Manual Pengguna Front-End Expression |