Saya melihat beberapa solusi proyek kode .
Tetapi apakah ada implementasi reguler dalam JavaScript?
Saya melihat beberapa solusi proyek kode .
Tetapi apakah ada implementasi reguler dalam JavaScript?
Jawaban:
Jika Anda harus menulis kode untuk Internet Explorer pastikan Anda memilih implementasi, yang menggunakan gabungan array. String penyambung dengan +
atau +=
operator sangat lambat pada IE. Ini terutama berlaku untuk IE6. Pada browser modern +=
biasanya hanya secepat bergabung dengan array.
Ketika saya harus melakukan banyak penggabungan string, saya biasanya mengisi array dan tidak menggunakan kelas pembuat string:
var html = [];
html.push(
"<html>",
"<body>",
"bla bla bla",
"</body>",
"</html>"
);
return html.join("");
Perhatikan bahwa push
metode menerima banyak argumen.
[foo(), "bar", "baz"].join("");
berfungsi juga.
push
bisa menerima banyak argumen. Hal-hal acak yang Anda pelajari.
Saya baru saja memeriksa ulang kinerjanya di http://jsperf.com/javascript-concat-vs-join/2 . Kasing uji menggabungkan atau menggabungkan alfabet 1.000 kali.
Di peramban saat ini (FF, Opera, IE11, Chrome), "concat" sekitar 4-10 kali lebih cepat daripada "join".
Di IE8, keduanya mengembalikan hasil yang sama.
Di IE7, "bergabung" sekitar 100 kali lebih cepat sayangnya.
Tidak, tidak ada dukungan bawaan untuk membangun string. Anda harus menggunakan rangkaian sebagai gantinya.
Anda bisa, tentu saja, membuat array dari berbagai bagian string Anda dan kemudian memanggil join()
array itu, tetapi kemudian tergantung pada bagaimana bergabung diimplementasikan dalam penerjemah JavaScript yang Anda gunakan.
Saya membuat percobaan untuk membandingkan kecepatan str1+str2
metode versus array.push(str1, str2).join()
metode. Kode itu sederhana:
var iIterations =800000;
var d1 = (new Date()).valueOf();
str1 = "";
for (var i = 0; i<iIterations; i++)
str1 = str1 + Math.random().toString();
var d2 = (new Date()).valueOf();
log("Time (strings): " + (d2-d1));
var d3 = (new Date()).valueOf();
arr1 = [];
for (var i = 0; i<iIterations; i++)
arr1.push(Math.random().toString());
var str2 = arr1.join("");
var d4 = (new Date()).valueOf();
log("Time (arrays): " + (d4-d3));
Saya mengujinya di Internet Explorer 8 dan Firefox 3.5.5, keduanya pada Windows 7 x64.
Pada awalnya saya menguji sejumlah kecil iterasi (beberapa ratus, beberapa ribu item). Hasilnya tidak dapat diprediksi (terkadang penggabungan string membutuhkan 0 milidetik, terkadang butuh 16 milidetik, sama untuk penggabungan array).
Ketika saya meningkatkan jumlah menjadi 50.000, hasilnya berbeda di browser yang berbeda - di Internet Explorer, penggabungan string lebih cepat (94 milidetik) dan join lebih lambat (125 milidetik), sementara di Firefox join join lebih cepat (113 milidetik) daripada penggabungan string (117 milidetik).
Kemudian saya menambah jumlah menjadi 500'000. Sekarang array.join()
adalah lebih lambat dari string Rangkaian di kedua browser: string concatenation adalah 937 ms di Internet Explorer, 1155 ms di Firefox, array yang bergabung 1265 di Internet Explorer, dan 1207 ms di Firefox.
Jumlah iterasi maksimum yang bisa saya uji di Internet Explorer tanpa "script terlalu lama untuk dieksekusi" adalah 850.000. Kemudian Internet Explorer adalah 1593 untuk penggabungan string dan 2046 untuk penggabungan array, dan Firefox memiliki 2101 untuk penggabungan string dan 2249 untuk penggabungan array.
Hasil - jika jumlah iterasi kecil, Anda dapat mencoba menggunakannya array.join()
, karena mungkin lebih cepat di Firefox. Ketika jumlahnya meningkat, string1+string2
metode ini lebih cepat.
Saya melakukan tes di Internet Explorer 6 (Windows XP). Proses berhenti merespons segera dan tidak pernah berakhir, jika saya mencoba tes pada lebih dari 100.000 iterasi. Pada 40.000 iterasi hasilnya
Time (strings): 59175 ms
Time (arrays): 220 ms
Ini berarti - jika Anda perlu mendukung Internet Explorer 6, pilih array.join()
cara mana yang lebih cepat daripada penggabungan string.
join()
adalah bagian dari ECMAScript dan afaik setiap penerjemah JavaScript yang mengimplementasikannya. Mengapa itu "tergantung"?
Kode itu terlihat seperti rute yang ingin Anda ambil dengan beberapa perubahan.
Anda ingin mengubah metode penambahan agar terlihat seperti ini. Saya telah mengubahnya untuk menerima angka 0, dan membuatnya kembali this
sehingga Anda dapat menambahkan rantai Anda.
StringBuilder.prototype.append = function (value) {
if (value || value === 0) {
this.strings.push(value);
}
return this;
}
null
, false
, string kosong, undefined
atau NaN
.
Versi ECMAScript 6 (alias ECMAScript 2015) JavaScript memperkenalkan string literal .
var classType = "stringbuilder";
var q = `Does JavaScript have a built-in ${classType} class?`;
Perhatikan bahwa tanda centang-kembali, bukan tanda kutip tunggal, melampirkan string.
Di C # Anda dapat melakukan sesuatu seperti
String.Format("hello {0}, your age is {1}.", "John", 29)
Di JavaScript Anda bisa melakukan sesuatu seperti
var x = "hello {0}, your age is {1}";
x = x.replace(/\{0\}/g, "John");
x = x.replace(/\{1\}/g, 29);
{0}
diganti berisi {1}
.
Bagi yang tertarik, berikut ini alternatif untuk memohon Array.join:
var arrayOfStrings = ['foo', 'bar'];
var result = String.concat.apply(null, arrayOfStrings);
console.log(result);
Output, seperti yang diharapkan, adalah string 'foobar'. Di Firefox, pendekatan ini mengungguli Array.join tetapi dikalahkan oleh + concatenation. Karena String.concat mengharuskan setiap segmen untuk ditetapkan sebagai argumen terpisah, pemanggil dibatasi oleh batas jumlah argumen yang diberlakukan oleh mesin JavaScript yang menjalankan. Lihatlah dokumentasi Function.prototype.apply () untuk informasi lebih lanjut.
Saya telah mendefinisikan fungsi ini:
function format() {
var args = arguments;
if (args.length <= 1) {
return args;
}
var result = args[0];
for (var i = 1; i < args.length; i++) {
result = result.replace(new RegExp("\\{" + (i - 1) + "\\}", "g"), args[i]);
}
return result;
}
Dan bisa disebut seperti c #:
var text = format("hello {0}, your age is {1}.", "John", 29);
Hasil:
halo John, usiamu 29 tahun.
Ketika saya menemukan diri saya melakukan banyak penggabungan string dalam JavaScript, saya mulai mencari templating. Handlebars.js berfungsi cukup baik agar HTML dan JavaScript lebih mudah dibaca. http://handlebarsjs.com
Bagaimana kalau sys.StringBuilder()
mencoba artikel berikut.