Apakah javascript menggunakan string yang tidak dapat diubah atau berubah? Apakah saya memerlukan "pembuat string"?
javascript
string
MengembangkanChris
sumber
sumber
Jawaban:
Mereka tidak berubah. Anda tidak dapat mengubah karakter dalam string dengan sesuatu seperti
var myString = "abbdef"; myString[2] = 'c'
. Metode manipulasi string sepertitrim
,slice
mengembalikan string baru.Dengan cara yang sama, jika Anda memiliki dua referensi ke string yang sama, memodifikasi satu tidak mempengaruhi yang lain
Namun, saya selalu mendengar apa yang disebutkan Ash dalam jawabannya (bahwa menggunakan Array.join lebih cepat untuk penggabungan) jadi saya ingin menguji berbagai metode merangkai string dan mengabstraksi cara tercepat menjadi StringBuilder. Saya menulis beberapa tes untuk melihat apakah ini benar (tidak!).
Ini adalah apa yang saya yakini sebagai cara tercepat, meskipun saya terus berpikir bahwa menambahkan pemanggilan metode mungkin membuatnya lebih lambat ...
Berikut ini adalah tes kecepatan kinerja. Mereka bertiga menciptakan string raksasa yang terdiri dari penggabungan
"Hello diggity dog"
seratus ribu kali menjadi string kosong.Saya telah membuat tiga jenis tes
Array.push
danArray.join
Array.push
, lalu menggunakanArray.join
Kemudian saya membuat tiga tes yang sama dengan mengabstraksikannya ke dalam
StringBuilderConcat
,StringBuilderArrayPush
danStringBuilderArrayIndex
http://jsperf.com/string-concat-without-sringbuilder/5 Silakan pergi ke sana dan menjalankan tes sehingga kita bisa mendapatkan sampel yang bagus. Perhatikan bahwa saya memperbaiki bug kecil, sehingga data untuk tes dihapus, saya akan memperbarui tabel setelah ada cukup data kinerja. Pergi ke http://jsperf.com/string-concat-without-sringbuilder/5 untuk tabel data lama.Berikut adalah beberapa angka (Pembaruan terbaru di Ma5rch 2018), jika Anda tidak ingin mengikuti tautan. Angka pada setiap tes dalam 1000 operasi / detik ( lebih tinggi lebih baik )
Temuan
Saat ini, semua browser evergreen menangani penggabungan string dengan baik.
Array.join
hanya membantu IE 11Secara keseluruhan, Opera tercepat, 4 kali lebih cepat dari Array.join
Firefox adalah yang kedua dan
Array.join
hanya sedikit lebih lambat di FF tetapi jauh lebih lambat (3x) di Chrome.Chrome adalah yang ketiga tetapi string concat 3 kali lebih cepat dari Array.join
Membuat StringBuilder tampaknya tidak terlalu mempengaruhi kinerja.
Semoga orang lain menemukan ini berguna
Kasus Uji yang berbeda
Karena @RoyTinker berpikir bahwa pengujian saya salah, saya membuat case baru yang tidak membuat string besar dengan menggabungkan string yang sama, menggunakan karakter yang berbeda untuk setiap iterasi. Rangkaian senar masih tampak lebih cepat atau sama cepatnya. Mari kita menjalankan tes-tes itu.
Saya menyarankan semua orang harus terus memikirkan cara lain untuk menguji ini, dan merasa bebas untuk menambahkan tautan baru ke berbagai kasus uji di bawah ini.
http://jsperf.com/string-concat-without-sringbuilder/7
sumber
join
concatenation vs string, karenanya membangun array sebelum pengujian. Saya tidak berpikir itu curang jika tujuan itu dipahami (danjoin
menyebutkan array secara internal, jadi tidak curang untuk menghilangkanfor
loop darijoin
tes, baik).Array.join
dari buku badak :
sumber
null
undefined
number
danboolean
. String diberikan oleh nilai dan bukan oleh referensi dan diteruskan demikian. Jadi, string bukan hanya tidak berubah, mereka adalah sebuah nilai . Mengubah string"hello"
menjadi"world"
seperti memutuskan bahwa mulai sekarang pada angka 3 adalah angka 4 ... itu tidak masuk akal.var a = "hello";var b=a;a.x=5;console.log(a.x,b.x);
String
objek yang dibuat menggunakan konstruktor string adalah pembungkus di sekitar nilai string JavaScript. Anda dapat mengakses nilai string dari tipe kotak menggunakan.valueOf()
fungsi - ini juga berlaku untukNumber
objek dan nilai angka. Penting untuk mencatatString
objek yang dibuat menggunakannew String
bukan string aktual tetapi pembungkus atau kotak di sekitar string. Lihat es5.github.io/#x15.5.2.1 . Tentang bagaimana benda dikonversi menjadi objek, lihat es5.github.io/#x9.9Kiat kinerja:
Jika Anda harus menggabungkan string besar, masukkan bagian string ke dalam array dan gunakan
Array.Join()
metode untuk mendapatkan keseluruhan string. Ini bisa berkali-kali lebih cepat untuk menggabungkan sejumlah besar string.Tidak ada
StringBuilder
dalam JavaScript.sumber
Hanya untuk memperjelas pikiran sederhana seperti milik saya (dari MDN ):
Abadi berarti bahwa:
Ini terlihat seperti kita memutasikan string 'immutableString', tapi ternyata tidak. Sebagai gantinya:
sumber
Nilai tipe string tidak dapat diubah, tetapi objek String, yang dibuat dengan menggunakan konstruktor String (), dapat berubah, karena ini adalah objek dan Anda dapat menambahkan properti baru ke dalamnya.
Sementara itu, meskipun Anda bisa menambahkan properti baru, Anda tidak bisa mengubah properti yang sudah ada
Cuplikan layar tes di konsol Chrome
Kesimpulannya, 1. semua nilai tipe string (tipe primitif) tidak dapat diubah. 2. Objek String dapat berubah, tetapi nilai tipe string (tipe primitif) yang dikandungnya tidak dapat diubah.
sumber
new String
menghasilkan wrapper yang bisa berubah-ubah di sekitar string yang tidak dapat diubahString
objek (pembungkus), yang berarti itu tidak dapat diubah (secara default; seperti objek lain yang dapat Anda panggilObject.freeze
untuk menjadikannya tidak berubah). Tetapi tipe nilai string primitif, apakah terkandung dalamString
objek wrapper atau tidak, selalu tidak berubah.String tidak dapat diubah - mereka tidak dapat berubah, kita hanya bisa membuat string baru.
Contoh:
sumber
Mengenai pertanyaan Anda (dalam komentar Anda untuk tanggapan Ash) tentang StringBuilder di ASP.NET Ajax, para ahli tampaknya tidak setuju dengan yang satu ini.
Christian Wenz mengatakan dalam bukunya Programming ASP.NET AJAX (O'Reilly) bahwa "pendekatan ini tidak memiliki efek yang terukur pada memori (pada kenyataannya, implementasi tampaknya lebih cepat daripada pendekatan standar)."
Di sisi lain Gallo dkk mengatakan dalam buku mereka ASP.NET AJAX in Action (Manning) bahwa "Ketika jumlah string untuk digabungkan lebih besar, pembuat string menjadi objek penting untuk menghindari penurunan kinerja besar."
Saya kira Anda perlu melakukan pembandingan sendiri dan hasilnya mungkin berbeda di antara peramban juga. Namun, bahkan jika itu tidak meningkatkan kinerja, itu mungkin masih dianggap "berguna" untuk programmer yang digunakan untuk pengkodean dengan StringBuilders dalam bahasa seperti C # atau Java.
sumber
Ini posting yang terlambat, tetapi saya tidak menemukan kutipan buku yang bagus di antara jawaban.
Inilah yang pasti kecuali dari buku yang dapat diandalkan:
Sekarang, jawaban yang mengutip kutipan buku Badak itu benar tentang kekekalan string tetapi salah mengatakan "String diberikan oleh referensi, bukan oleh nilai." (mungkin mereka awalnya bermaksud menempatkan kata-kata dengan cara yang berlawanan).
Kesalahpahaman "referensi / nilai" diklarifikasi dalam "JavaScript Profesional", bab bernama "Nilai-nilai Primitif dan Referensi":
yang bertentangan dengan objek :
sumber
String JavaScript memang tidak dapat diubah.
sumber
String dalam Javascript tidak dapat diubah
sumber