Saya tahu ini adalah pertanyaan yang sangat lama, tetapi saya tidak 100% senang dengan jawaban mana pun karena semuanya tampak tidak lengkap. Jadi di sini kita pergi lagi dari kepala sekolah pertama:
Tujuan keseluruhan pengguna:
Meringkas kode: "Saya ingin menambahkan error
nama kelas ke string, opsional dengan spasi di depan jika sudah ada nama kelas dalam string."
Solusi paling sederhana
Seperti yang ditunjukkan Kobi, 5 tahun yang lalu, memiliki ruang terdepan dalam nama kelas tidak akan menyebabkan masalah dengan browser yang dikenal, jadi solusi terpendek yang benar adalah:
h.className += ' error';
Itu seharusnya menjadi jawaban yang sebenarnya untuk masalah yang sebenarnya .
Bagaimanapun, pertanyaan yang diajukan adalah ...
1) Mengapa ini berhasil?
h.className += h.className ? ' error' : 'error'
Operator kondisional / ternary bekerja seperti pernyataan if, yang memberikan hasil jalur true
atau false
ke variabel.
Jadi kode itu berfungsi karena dievaluasi hanya sebagai:
if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
2) dan mengapa ini pecah?
h.className = h.className + h.className ? ' error' : 'error'
Pertanyaan tersebut menyatakan "yang memberikan [n] kesalahan di konsol saya", yang mungkin menyesatkan Anda sehingga mengira kode tersebut tidak berfungsi . Bahkan kode berikut tidak berjalan, tanpa kesalahan , tapi itu hanya kembali 'kesalahan' jika string tidak kosong dan 'kesalahan' jika string adalah kosong dan begitu tidak memenuhi persyaratan .
Kode itu selalu menghasilkan string yang hanya berisi ' error'
atau 'error'
karena dievaluasi ke kode pseudo ini:
if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
Alasan untuk ini adalah bahwa operator penjumlahan ( +
untuk rakyat biasa) memiliki "prioritas" yang lebih tinggi (6) daripada operator bersyarat / terner (15). Saya tahu angkanya muncul di belakang
Diutamakan berarti bahwa setiap jenis operator dalam suatu bahasa dievaluasi dalam urutan tertentu yang telah ditentukan sebelumnya (dan tidak hanya kiri-ke-kanan).
Bagaimana mengubah urutan evaluasi:
Sekarang kami tahu mengapa gagal, Anda perlu tahu cara membuatnya bekerja.
Beberapa jawaban lain berbicara tentang mengubah prioritas , tetapi Anda tidak bisa . Prioritas sudah terprogram ke dalam bahasa. Itu hanya seperangkat aturan tetap ... Namun, Anda dapat mengubah urutan evaluasi ...
Alat di kotak alat kami yang dapat mengubah urutan evaluasi adalah operator pengelompokan (alias tanda kurung). Ini dilakukan dengan memastikan ekspresi dalam tanda kurung dievaluasi sebelum operasi di luar tanda kurung. Itu saja yang mereka lakukan, tapi itu sudah cukup.
Tanda kurung berfungsi hanya karena mereka (operator pengelompokan) memiliki prioritas lebih tinggi daripada semua operator lainnya ("sekarang ada level 0").
Dengan hanya menambahkan tanda kurung, Anda mengubah urutan evaluasi untuk memastikan pengujian bersyarat dilakukan terlebih dahulu, sebelum penggabungan string sederhana:
h.className = h.className + (h.className ? ' error' : 'error')
Sekarang saya akan meninggalkan jawaban ini untuk karat yang tidak terlihat di antara yang lain :)
h.className += ' error'
, itu juga meninggalkan ruang kosong di awal string jika awalnya kosong. Saya percaya inti dari operasi terner adalah untuk menghasilkan string yang tampak bersih.