Rumah  >  Artikel  >  hujung hadapan web  >  Penjelasan terperinci tentang penggabungan rentetan dalam kemahiran javascript_javascript

Penjelasan terperinci tentang penggabungan rentetan dalam kemahiran javascript_javascript

WBOY
WBOYasal
2016-05-16 16:35:121164semak imbas

Baru-baru ini, semasa mempelajari "Pengaturcaraan Lanjutan Javascript", terdapat penerangan tentang ciri-ciri rentetan Teks asal kira-kira seperti berikut: Rentetan dalam ECMAScript tidak boleh diubah, iaitu, apabila rentetan dicipta, nilainya ​tidak boleh diubah. Untuk menukar rentetan yang disimpan dalam pembolehubah, musnahkan rentetan asal dahulu dan kemudian isikan pembolehubah itu dengan rentetan lain yang mengandungi nilai baharu, contohnya:

Salin kod Kod adalah seperti berikut:

var lang = "Java";
lang = lang "Skrip";

Proses melaksanakan operasi ini adalah seperti berikut: mula-mula buat rentetan baharu yang boleh memuatkan 10 aksara, kemudian isi rentetan ini dengan "Java" dan "Skrip", dan langkah terakhir ialah memusnahkan rentetan asal "Java" dan "Skrip", kerana kedua-dua rentetan ini tidak lagi berguna. Walau bagaimanapun, dalam pelayar versi yang lebih rendah (seperti IE6), kelajuan penggabungan rentetan adalah proses yang sangat memakan prestasi.

Ini mengingatkan saya kepada Java Mekanisme rentetan dalam Java adalah serupa dengan js (iaitu, ia tidak boleh diubah setelah ia dibuat, dan nilai asal hanya boleh dimusnahkan jika anda ingin mengubahnya). mempunyai StringBuffer untuk menyelesaikan masalah ketidakupayaan rentetan Masalahnya ialah tiada kaedah yang serupa dalam js. Tetapi kita boleh mensimulasikan mekanisme penimbal ini. Prinsipnya ialah menggunakan tatasusunan untuk penyambungan Kod sumber adalah seperti berikut:

Salin kod Kod adalah seperti berikut:

fungsi StringBuffer() {
This.__strings__ = new Array();
}
StringBuffer.prototype.append = fungsi (str) {
This.__strings__.push(str);
Kembalikan ini; //Kendalian rantai yang mudah
}
StringBuffer.prototype.toString = fungsi () {
Kembalikan ini.__strings__.join("");
}

/*Ujian*/
var buffer = new StringBuffer();
buffer.append("Hello ").append("javascript");

hasil var = buffer.toString();
makluman(hasil);

ps: Alamat intinya adalah seperti berikut:

https://gist.github.com/hehongwei44/fe71f10e4d2d9295aeab

Kami telah mensimulasikan mekanisme, tetapi sejauh manakah prestasi kaedah ini daripada penyambungan rentetan Kami boleh mengujinya Kod ujian adalah seperti berikut:

Salin kod Kod adalah seperti berikut:
var d1 = new Date();
var str = "";
untuk(var i = 0; i < 10000; i ){
str = "teks ";
}
var d2 = new Date();
document.write("Uji satu kos: " (d2.getTime() - d1.getTime())/1000 "saat" "
");
var oBuffer = new StringBuffer();

d3 = Tarikh baharu();
untuk(var i = 0; i < 10000; i ){
oBuffer.append("teks ");
}
var sResult = oBuffer.toString();
d4 = Tarikh baharu();
document.write("Kos ujian 2: " (d4.getTime() - d3.getTime())/1000 "saat");

Keputusan ujian adalah seperti berikut: (Keputusan ujian mungkin berbeza bergantung pada persekitaran):

1. Berdasarkan perbandingan 1000 kali, kedua-dua pelaksanaan adalah sangat pantas (pada asasnya beberapa milisaat) dan penggunaan masa adalah serupa.

2. Dengan 10,000 kali sebagai asas, keputusan pelaksanaan adalah serupa dengan di atas, tetapi yang pertama mempunyai lebih banyak caj panggilan di bawah IE6.
3. Mengambil 100,000 kali sebagai asas, penyambungan rentetan jelas memerlukan lebih banyak masa di bawah IE6 pelayar lain tidak jauh berbeza, dan ada yang lebih pendek daripada StringBuffer.

Kesimpulan

1. Apabila bilangan perkataan yang disambungkan kurang daripada 1,000 kali, dengan berani menggunakan kata yang pertama Secara amnya, kita jarang menghadapi situasi di mana bilangan perkataan yang disambungkan adalah beribu-ribu.

2. Pelayar lain tidak mempunyai masalah prestasi dengan penyambungan, terutamanya IE6 Jika bilangan penyambungan adalah puluhan ribu atau ratusan ribu, adalah disyorkan untuk menggunakan simulasi StringBuffer untuk IE6 sahaja.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn