Semua orang terus mengatakan bahwa salah satu masalah JavaScript adalah menggunakan +
[ contoh ] untuk penggabungan string. Ada yang bilang masalahnya tidak menggunakan +
, itu tipe paksaan [lihat komentar dari contoh sebelumnya]. Tetapi bahasa yang diketik dengan kuat menggunakan + untuk jenis penggabungan dan pemaksaan tanpa masalah. Misalnya, dalam C #:
int number = 1;
MyObject obj = new MyObject();
var result = "Hello" + number + obj;
// is equivalent to
string result = "hello" + number.ToString() + obj.ToString();
Jadi mengapa penggabungan string dalam JavaScript adalah masalah besar?
javascript
konfigurator
sumber
sumber
bad
. SiapaEveryone
?Jawaban:
Pertimbangkan kode JavaScript ini:
Ini akan masuk
Yang paling mungkin bukan yang dimaksudkan, dan bisa sulit untuk melacak bug.
sumber
a
danb
masukstr(a)
danstr(b)
menelepon; jika tidak, Anda mendapatkanValueError: cannot concatenate 'str' and 'int'
.'result is ' + (a + b)
.System.Console.WriteLine("result is " + 10 + 20);
, tetapi tidak ada yang pernah mengeluh tentang itu di C #. Itu yang saya tidak mengerti - apa tentang JavaScript yang membuatnya lebih membingungkan?Ketika Anda mengatakan "buruk", apakah yang Anda maksud "salah" atau maksudnya "lambat"? Argumen tentang penggunaan operator matematika untuk melakukan penggabungan string dapat dikatakan sebagai argumen yang "salah", tetapi ada juga argumen yang mengatakan bahwa menggunakan
+
untuk melakukan banyak penggabungan string bisa sangat lambat.Kita tidak berbicara tentang
"Hello" + number
ketika kita berbicara tentang kinerja, kita berbicara tentang membangun string yang relatif besar dengan berulang kali menambahkannya dalam satu lingkaran.Dalam JavaScript (dan C # dalam hal ini) string tidak berubah. Mereka tidak pernah bisa diubah, hanya diganti dengan string lainnya. Anda mungkin sadar bahwa
combined + "hello "
itu tidak secara langsung memodifikasicombined
variabel - operasi menciptakan string baru yang merupakan hasil menggabungkan dua string bersama-sama, tetapi Anda kemudian harus menetapkan string baru kecombined
variabel jika Anda ingin itu diubah.Jadi apa yang dilakukan loop ini adalah menciptakan jutaan objek string yang berbeda, dan membuang 999.999 darinya. Membuat banyak string yang terus tumbuh dalam ukuran tidak cepat, dan sekarang pengumpul sampah memiliki banyak pekerjaan yang harus dilakukan untuk membersihkan setelah ini.
C # memiliki masalah yang sama persis, yang diselesaikan di lingkungan itu oleh kelas StringBuilder . Dalam JavaScript, Anda akan mendapatkan kinerja yang jauh lebih baik dengan membangun array dari semua string yang ingin Anda gabungkan, dan kemudian bergabung bersama-sama satu kali di akhir, bukannya satu juta kali di loop:
sumber
Tidak buruk menggunakan + untuk penambahan dan penggabungan, selama Anda hanya dapat menambahkan angka, dan hanya string gabungan. Namun, Javascript akan secara otomatis mengkonversi antara angka dan string sesuai kebutuhan, sehingga Anda memiliki:
Mungkin lebih sederhana, kelebihan "+" di hadapan konversi tipe otomatis mematahkan asosiasi yang diharapkan dari operator +:
sumber
3 + 5 == 5 + 3
tetapi"3" + "5" != "5" + "3"
Masalah khas yang dibawa untuk penggabungan string berkisar pada beberapa masalah:
+
simbol yang kelebihan beban# 1
Masalah pertama dan terpenting dengan penggunaan
+
untuk penggabungan dan penambahan string adalah bahwa Anda menggunakan+
untuk penggabungan dan penambahan string .jika Anda memiliki variabel
a
danb
, dan Anda mengaturc = a + b
, ada ambiguitas tergantung pada jenisa
danb
. Ambiguitas ini memaksa Anda untuk mengambil langkah-langkah tambahan untuk mengurangi masalah:String Concat:
Tambahan:
Ini membawa saya ke poin kedua saya
# 2
Sangat mudah untuk secara tidak sengaja melemparkan variabel ke string tanpa menyadarinya. Juga mudah untuk melupakan bahwa input Anda masuk sebagai string:
Akan menghasilkan hasil yang tidak intuitif karena prompt mengembalikan nilai string input.
# 3
Perlu mengetik
parseFloat
atauNumber()
setiap kali saya ingin melakukan penambahan itu membosankan dan menjengkelkan. Saya menganggap diri saya cukup pintar untuk mengingat tidak mengacaukan tipe dinamis saya, tetapi itu tidak berarti saya tidak pernah mengacaukan tipe dinamis saya . Kebenaran dari masalah ini adalah bahwa saya terlalu malas untuk mengetikparseFloat
atauNumber()
setiap kali saya melakukan penambahan, karena saya melakukan banyak penambahan.Larutan?
Tidak semua bahasa digunakan
+
untuk penggabungan string. PHP menggunakan.
untuk menggabungkan string, yang membantu membedakan antara kapan Anda ingin menambahkan angka dan kapan Anda ingin bergabung dengan string.Simbol apa pun dapat digunakan untuk menggabungkan string, tetapi sebagian besar sudah digunakan, dan yang terbaik adalah menghindari duplikasi. Jika saya punya cara saya, saya mungkin akan menggunakan
_
untuk bergabung dengan string, dan melarang_
dalam nama variabel.sumber