Baru -baru ini, dalam studi "JavaScript Advanced Programming", ada deskripsi karakteristik string. Teks asli kira -kira sebagai berikut: string dalam ecmascript tidak dapat diubah, yaitu, begitu string dibuat, nilainya tidak dapat diubah. Untuk mengubah string yang disimpan dari variabel, hancurkan string asli, dan kemudian isi variabel dengan string lain yang berisi nilai baru, misalnya:
Salinan kode adalah sebagai berikut:
var lang = "java";
lang = lang + "skrip";
Proses menerapkan operasi ini adalah sebagai berikut: Pertama -tama buat string baru yang dapat menampung 10 karakter, dan kemudian mengisinya dengan "java" dan "skrip" dalam string ini. Langkah terakhir adalah menghancurkan string asli "Java" dan "Script", karena kedua string ini tidak berguna. Namun, dalam versi browser yang lebih rendah (seperti IE6), kecepatan splicing string adalah proses yang memakan kinerja.
Dari sini saya memikirkan Java. Mekanisme string dalam Java mirip dengan JS (yaitu, tidak dapat diubah setelah pembuatan, dan untuk mengubahnya hanya dapat menghancurkan nilai asli), tetapi Java memiliki stringBuffer yang memecahkan masalah kekekalan string, dan JS tidak memiliki metode yang sama. Tapi kita bisa mensimulasikan mekanisme buffering ini. Prinsipnya adalah menggunakan array untuk splicing, kode sumbernya adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
function stringBuffer () {
ini .__ string__ = array baru ();
}
StringBuffer.Prototype.append = function (str) {
ini .__ string __. Push (str);
kembalikan ini; // Operasi rantai yang nyaman
}
StringBuffer.Prototype.ToString = function () {
kembalikan string ini .__ __. gabung ("");
}
/*tes*/
var buffer = stringBuffer baru ();
buffer.append ("hello"). append ("javascript");
var result = buffer.toString ();
waspada (hasil);
PS: Alamat GIST adalah sebagai berikut: https://gist.github.com/hehongwei44/fe71f10e4d2d9295aab
Kami telah mensimulasikan mekanisme, tetapi ada perbedaan dalam kinerja antara metode ini dan splicing string. Kita dapat mengujinya, dan kode uji adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
var d1 = tanggal baru ();
var str = "";
untuk (var i = 0; i <10000; i ++) {
str += "teks";
}
var d2 = tanggal baru ();
document.write ("Tes satu biaya:" + (d2.getTime () - d1.getTime ())/1000 + "detik" + "<br/>");
var obuffer = stringBuffer baru ();
d3 = tanggal baru ();
untuk (var i = 0; i <10000; i ++) {
Obuffer.Append ("Teks");
}
var sresult = obuffer.toString ();
d4 = tanggal baru ();
Document.write ("Uji dua biaya:" + (d4.getTime () - d3.getTime ())/1000 + "detik");
Hasil tes adalah sebagai berikut: (Hasil tes mungkin berbeda di lingkungan yang berbeda):
1. Saat membandingkan 1000 kali sebagai basis, eksekusi keduanya sangat cepat (milidetik dasar) dan membutuhkan waktu yang sama. Perbedaan terakhir antara yang pertama tidak akan melebihi 10 milidetik.
2. Dengan 10.000 kali sebagai pangkalan, hasil eksekusi mirip dengan yang di atas, tetapi yang pertama memiliki lebih banyak tagihan telepon di bawah IE6.
3. Dengan 100.000 kali sebagai pangkalan, splicing string di IE6 jelas membutuhkan lebih banyak waktu, dan browser lainnya tidak jauh berbeda, dan beberapa lebih pendek dari StringBuffer.
sebagai kesimpulan
1. Ketika jumlah kata splicing kurang dari 1.000 kali, dengan berani menggunakan yang pertama, dan kami jarang menghadapi ribuan waktu penyambungan.
2. Browser lain tidak memiliki masalah kinerja dengan splicing, terutama IE6. Jika waktu menyambung biaya puluhan ribu atau ratusan ribu, disarankan untuk menggunakan StringBuffer untuk mensimulasikan IE6 saja.