Saya sedang menyemak imbas beberapa soalan temu duga bahagian hadapan Alibaba baru-baru ini, dan salah satu daripadanya melibatkan penggunaan kaedah replace() dalam JavaScript Berikut ialah soalan asal:
“Beritahu saya apa fungsi berikut lakukan? Apakah yang perlu diisi dalam ruang kosong?”
// define (function (window) { function fn(str) { this.str = str; } fn.prototype.format = function () { var arg = ______; return this.str.replace(_______, function (a, b) { return arg[b] || ''; }); } window.fn = fn; })(window); // use (function(){ var t = new fn('<p><a href="{0}">{1}</a><span>{2}</span></p>'); console.log( t.format('http://www.alibaba.com', 'Alibaba', 'Welcome') ); })();
Berikut adalah proses analisis (rasanya lebih baik untuk menomborkannya, secara peribadi saya rasa ia lebih teratur)
1. Kerana soalan ini juga melibatkan mata pengetahuan lain, seperti fungsi tanpa nama, prototaip, dll., tetapi ia bukan fokus perbincangan ini.
2. Mengikut soalan, kita tahu kod sumber soalan ini serupa dengan menulis enjin templat. Gantikan ruang letak seperti '{1}' dalam templat dengan parameter yang dihantar kepadanya. Jadi arg sepatutnya menjadi hujah. tetapi! ! ! Memandangkan arg bukan tatasusunan, tetapi objek seperti tatasusunan (jika anda tidak faham, anda boleh google sendiri (u_u)), jadi kami perlu melakukan beberapa penukaran,
3. Bahagian kanan tanda sama ialah jawapan kosong pertama. Setelah berkata begitu banyak, maka ruang kedua adalah fokus perbincangan kami~~~~~~Kita semua tahu bahawa ruang kedua adalah untuk mencari ruang letak melalui ungkapan biasa dan menukarnya mengikut nombor dalam ruang letak rentetan dalam tatasusunan arg. Sejujurnya, jarang ditemui bahawa parameter kedua bagi kaedah ganti ialah suatu fungsi
Pertama sekali, ini ialah sintaks bagi fungsi ganti: stringobject.replace(regexp/substr,replacement)
Di mana regexp/substr diperlukan. Objek regexp yang menentukan rentetan atau corak yang akan diganti. (Perhatikan bahawa jika nilai ialah rentetan, ia diambil semula sebagai corak literal literal dan bukannya ditukar terlebih dahulu kepada objek regexp.) penggantian diperlukan. Nilai rentetan. Menentukan fungsi untuk menggantikan teks atau menjana teks gantian. Akhirnya, rentetan baharu dikembalikan, yang diperoleh selepas menggantikan padanan pertama atau semua padanan regexp dengan penggantian.
5. ECMAScript menetapkan bahawa penggantian parameter kaedah replace() boleh menjadi fungsi dan bukannya rentetan. Dalam kes ini, fungsi dipanggil untuk setiap padanan dan rentetan yang dipulangkan digunakan sebagai teks gantian. Parameter pertama mewakili aksara yang dipadankan, parameter kedua mewakili kedudukan indeks minimum aksara yang dipadankan (RegExp.index), dan parameter ketiga mewakili rentetan yang dipadankan (RegExp.input).
6. Jadi ruang kedua boleh ditulis seperti ini: /{(d )}/g, dan ayat lengkap apabila diletakkan dalam pernyataan ialah:
7. Di atas adalah penjelasan parameter kedua kaedah rentetan js replace() sebagai fungsi (jika terdapat sebarang ketidaksempurnaan, sila tambah sendiri, soalan temuduga ini juga telah diselesaikan~ ~~~~