Tampaknya baru-baru ini fashionable untuk menghilangkan titik koma dari Javascript. Ada posting blog beberapa tahun yang lalu yang menekankan bahwa dalam Javascript, titik koma adalah opsional dan inti dari postingan tersebut adalah bahwa Anda tidak boleh repot-repot dengan mereka karena mereka tidak perlu. Posting tersebut, dikutip secara luas, tidak memberikan alasan kuat untuk tidak menggunakannya, hanya saja meninggalkannya memiliki beberapa efek samping.
Bahkan GitHub telah melompat pada kereta musik no-titik koma, membutuhkan penghilangan mereka dalam kode yang dikembangkan secara internal, dan komitmen baru - baru ini untuk proyek zepto.js oleh pengelolanya telah menghapus semua titik koma dari basis kode. Pembenaran utamanya adalah:
- ini masalah pilihan timnya;
- kurang mengetik
Apakah ada alasan bagus lainnya untuk tidak melakukannya?
Terus terang saya tidak melihat alasan untuk menghilangkannya, dan tentu saja tidak ada alasan untuk kembali kode untuk menghapusnya. Ini juga bertentangan dengan ( tahun ) praktik yang disarankan , yang saya tidak benar-benar beli dengan argumen "pemujaan kargo". Jadi, mengapa semua titik koma-benci baru-baru ini? Apakah ada kekurangan yang menjulang? Atau ini hanya tren Javascript terbaru?
sumber
;
dapat rusak. Jadi saya katakan itu referensi yang berguna untuk pertanyaan ini.Jawaban:
Saya kira alasan saya adalah yang paling lama: Saya memprogram dalam banyak bahasa yang berbeda secara bersamaan (Java, Javascript, PHP) - yang membutuhkan ';' jadi daripada melatih jari dan mata saya bahwa ';' tidak diperlukan untuk javascript, saya hanya selalu menambahkan ';'
Alasan lainnya adalah dokumentasi: dengan menambahkan ';' Saya secara eksplisit menyatakan pada diri sendiri di mana saya mengharapkan pernyataan itu berakhir. Kemudian lagi saya menggunakan {} sepanjang waktu juga.
Seluruh argumen jumlah byte yang saya rasa menjengkelkan dan tidak berguna:
1) untuk perpustakaan umum seperti jquery: gunakan google CDN dan perpustakaan mungkin sudah ada dalam cache browser
2) versi perpustakaan Anda sendiri dan mengaturnya untuk di-cache selamanya.
3) gzip dan kecilkan jika benar-benar diperlukan.
Tapi benarkah berapa banyak situs yang memiliki kecepatan terbesar sebagai penghambat kecepatan unduhan javascript mereka? Jika Anda bekerja untuk 100 situs teratas seperti twitter, google, yahoo, dll. Mungkin. Kita semua hanya perlu khawatir tentang kualitas kode bukan perang agama titik koma.
sumber
Itu membuat metode chaining lebih mudah dan melakukan diffs lebih bersih
Jadi katakanlah saya bertanya tentang dan saya punya
Jika saya ingin menambahkan barang - barang dan menjaga komit berbasis baris saya kecil , saya harus menambahkannya di atas attr. Jadi itu satu pemikiran lebih lama dari sekedar "tambahkan di akhir". Dan siapa yang mau berpikir? =)
Tapi, ketika saya menjatuhkan titik koma, saya bisa menambahkan dan menyebutnya sehari
Juga, jika saya memutuskan untuk menghapus metode terakhir, saya tidak perlu menetapkan kembali semi-colon dan mencemari komit saya lagi.
Lawan uggo
sumber
semi-titik dua dalam JavaScript adalah opsional
Alasan pribadi saya untuk tidak menggunakan titik koma adalah OCD.
Ketika saya menggunakan titik dua, saya lupa 2% dari mereka dan harus terus-menerus memeriksa / menambahkannya kembali.
Ketika saya tidak menggunakan titik koma saya tidak pernah sengaja memasukkannya jadi saya tidak perlu memeriksa / menghapusnya.
sumber
Baru-baru ini saya menulis parser / analyzer untuk JavaScript, di mana saya harus menerapkan ASI dengan susah payah, dan saya juga memiliki salinan Crockford's JavaScript: The Good Parts di rak buku saya, yang selalu dianjurkan menggunakan titik koma. Niatnya baik, tetapi tidak selalu membantu dalam praktik.
Jelas, orang-orang yang menulis kerangka kerja seperti jQuery, zepto, dll. Adalah master sintaksis JavaScript dan karenanya mereka tahu perbedaan antara:
dan
JavaScript, walaupun kuat, juga merupakan bahasa pemula dan keberuntungan menjelaskan hal ini kepada seseorang yang baru belajar apa itu
for
loop. Seperti memperkenalkan kebanyakan orang pada keterampilan baru, ada beberapa hal yang lebih rumit yang tidak ingin Anda jelaskan segera, jadi alih-alih Anda memilih menanamkan kepercayaan "kultus kargo" pada hal-hal tertentu hanya untuk membuat mereka keluar dari lapangan. Jadi, Anda memiliki dua pilihan saat mengajar pemula cara menulis JavaScript:return
dengan a{
, dan b) Ketika sebuah baris dimulai dengan a(
, tambahkan dengan;
.Memilih opsi 2 adalah seperangkat aturan "kultus kargo" yang lebih baik untuk diikuti (akan menghasilkan sangat sedikit bug terkait ASI), dan bahkan jika Anda benar-benar memahami topik ini, Anda memiliki lebih sedikit karakter yang tidak dibutuhkan di layar.
sumber
return
dianggap sebagai pernyataan soliter dan garis-akhir adalah setara dengan titik koma. Contoh kedua sebenarnya mengembalikan objek. Berdandan.return
contoh ini sebenarnya merupakan pengecualian untuk perilaku JS normal yang mencoba untuk menarik garis bersama ketika titik koma dihilangkan.return
,,break
dancontinue
semua menunjukkan perilaku luar biasa ini di mana baris baru yang tertinggal selalu ditafsirkan sebagai akhir dari pernyataan. (Sumber adalah "JavaScript: The Definitive Guide" dari Flanagan hlm. 25-26). Secara pribadi, saya mengusahakan ide "kode kejutan paling tidak." Meninggalkan semi-titik dua cenderung menghasilkan lebih banyak kejutan daripada apa pun (saya umumnya juga menjaga kurung kurawal saya bahkan untuk pernyataan sederhana).Ini adalah aturan umum dalam desain grafis untuk mengabaikan elemen dan ornamen yang tidak perlu untuk mengurangi kebisingan.
Lebih sedikit elemen visual pada layar berarti lebih sedikit kerja untuk otak kita untuk mengurai informasi berguna yang sebenarnya.
vs.
Contoh berlebihan tentu saja, tetapi menggambarkan prinsip umum: Elemen visual tambahan harus ditambahkan jika dan hanya jika mereka melayani tujuan. Jadi, apakah titik koma memiliki tujuan?
Alasan historis untuk menggunakan titik koma dalam JavaScript adalah:
Masalah kompatibilitas tidak menjadi masalah saat ini. Linter modern dapat mendeteksi kesalahan kode sama baiknya tanpa titik koma. Kemiripan dengan C / Java / PHP masih bisa menjadi pertimbangan (lihat jawaban yang diterima oleh Pat), tetapi hanya karena bahasa lain mengandung elemen sintaks yang berlebihan tidak berarti kita harus menyimpannya dalam JavaScript, terutama karena banyak bahasa lain (Coffeescript, Python, Ruby, Scala, Lua) tidak memerlukannya.
Saya melakukan tes cepat untuk melihat apakah ada penalti performa di V8. Ini adalah Io.js mem-parsing file JavaScript 41 MB (Lodash diulang 100 kali) dengan titik koma dan kemudian dengan titik koma dihapus:
Setiap orang harus memutuskan gaya pengkodean pilihan mereka sendiri untuk proyek mereka, tetapi saya tidak lagi melihat manfaat nyata dalam menggunakan titik koma, jadi untuk mengurangi kebisingan visual, saya sudah berhenti.
sumber
Memilih konvensi pemrograman sama efektifnya dengan memilih subset dari bahasa target. Kita semua melakukan ini karena alasan biasa: keterbacaan kode, pemeliharaan, stabilitas, portabilitas, dll - sambil berpotensi mengorbankan fleksibilitas. Alasan-alasan ini adalah alasan bisnis yang nyata.
Alasan seperti "menghemat penekanan tombol," dan "programmer harus mempelajari aturan JavaScript" adalah alasan bisnis marjinal sehingga hanya sedikit membawa beban praktis.
Dalam kasus saya, saya harus mempercepat JavaScript dengan sangat cepat, jadi memanfaatkan sebagian bahasa secara terbatas adalah keuntungan saya. Jadi saya memilih subset JSLint dari JavaScript, mengaktifkan aplikasi Rockstar JSLinter di Eclipse ke pengaturan paling restriktif yang bisa saya tahan, dan belum melihat ke belakang.
Saya bersyukur bisa menghindari detail perbedaan antara "==" dan "===", atau detail penyisipan titik koma, karena saya sudah punya mil daftar tugas yang tinggi dan detail-detail itu tidak akan bantu menyelesaikan pekerjaan itu satu detik sebelumnya.
Tentu saja hal yang paling penting tentang sebuah konvensi adalah konsistensi, dan menganggapnya sebagai bagian bahasa membantu memperkuat keharusan ini. Dan meskipun ini mungkin tidak membantu menjawab pertanyaan OP, saya pikir mungkin membantu dengan pembingkaian praktisnya.
sumber
Pertanyaan yang cukup lama, namun saya terkejut tidak ada yang menyebutkan:
Minifikasi: Jika Anda memotong minifikan JavaScript yang tidak secara eksplisit mengakhiri pernyataan dengan karakter semi-kolon, Anda mungkin akan kesulitan mencari tahu apa yang salah dengan snippet yang baru berfungsi sebelum minifikasi dan sekarang tidak berfungsi.
Ambiguitas: Semi-titik dua adalah opsional, benar, namun dengan menghilangkannya dari kode sumber, Anda mungkin meninggalkan beberapa skenario ambigu ke parser untuk memutuskan sendiri. Jika Anda menulis 100 baris kode untuk toko online, ya, mungkin itu tidak masalah, tetapi tugas yang lebih serius akan membutuhkan kejelasan 100%.
Dahulu kala saya membaca analogi yang sangat bagus tentang sesuatu yang lain tetapi sangat benar dalam kasus ini juga: (Dalam kasus kami) Menghilangkan semi-titik dua sama seperti menyeberang di lampu merah. Anda mungkin baik-baik saja pada akhirnya atau Anda mungkin tertabrak truk.
Mengapa hari ini menjadi lebih populer?
Saya pribadi percaya bahwa menjalankan JavaScript di sisi server memiliki banyak efek pada komunitas JavaScript itu sendiri. Dalam kasus kami, jelas tidak ada yang akan mengecilkan JavaScript di sisi server (karena kode sumber tidak seharusnya dikirimkan ke browser web klien), jadi tanpa semi-titik tampak jauh lebih aman yang benar; namun pengembang lain yang belajar dari buku, artikel, dan video ini, sayangnya mereka mengabaikan fakta bahwa JavaScript di sisi server tidak persis sama dengan JavaScript di sisi klien.
sumber
Ada alasan bagus untuk menyimpannya.
Mereka tidak benar-benar opsional, JS dapat menambahkannya kembali dengan penyisipan titik koma otomatis ketika mereka hilang tetapi itu bukan hal yang sama.
JavaScript Douglas Crockford: The Good Parts mengatakan pada dua kesempatan terpisah bahwa itu adalah ide yang buruk. Penyisipan titik koma otomatis dapat menyembunyikan bug di program Anda dan menciptakan ambiguitas.
JSLint tidak menyetujui.
sumber
JavaScript tidak membutuhkan semi-titik dua untuk mengakhiri pernyataan dalam lebih dari satu dekade. Itu karena karakter baris baru dianggap sebagai terminator pernyataan (saya percaya ini juga disebutkan dalam spesifikasi ECMAScript awal). Ini benar-benar masuk akal, terutama karena benar-benar tidak ada alasan [mengapa saya tahu] mengapa JavaScript perlu sering menggunakan semi-titik dua tetapi tidak bahasa deklaratif lain yang ditafsirkan seperti Ruby atau Python.
Membutuhkan semi-titik dua dapat membuatnya lebih mudah untuk menulis parser untuk suatu bahasa, tetapi jika setiap penerjemah di luar sana mendukung penghapusan semi-titik dua maka apa gunanya?
Apa yang terjadi adalah seberapa berpengetahuan seorang programmer: jika Anda tahu bahwa Anda dapat menghilangkan titik koma, jangan ragu untuk memahami bahwa mungkin ada atau tidak ada konsekuensinya. Manusia adalah mesin pembuat keputusan dan hampir semua keputusan membutuhkan kompromi atau pertukaran. Pertukaran dengan hanya melemparkan semi-titik dua di sekitar kode Anda (bahkan di tempat-tempat di mana mereka tidak diperlukan) adalah bahwa kode Anda menjadi kurang dapat dibaca (tergantung pada yang Anda tanyakan) dan JSLint tidak akan mengeluh (siapa yang peduli ). Di sisi lain, trade-off untuk menghilangkan semi-titik dua adalah kenyataan bahwa 90% programmer JavaScript akan menghukum Anda untuk itu, tetapi Anda mungkin akhirnya lebih suka menulis JavaScript karena itu.
Apa yang terdengar lebih baik bagi Anda; membuat keputusan berdasarkan informasi atau membuat keputusan secara buta / mentalitas kawanan?
sumber
Saya punya dua teori:
SEBUAH)
Hal tentang pilihan ini adalah bahwa pada hari itu, ketika JSLint dll berlaku, Anda memilih untuk menghabiskan banyak waktu menangkap kesalahan sintaksis yang tidak jelas, atau jumlah waktu yang wajar untuk menegakkan kebijakan standar tentang kode.
Namun, ketika kita bergerak lebih ke arah kode Unit- driven tes dan integrasi terus menerus jumlah waktu (dan interaksi manusia) yang diperlukan untuk menangkap kesalahan sintaks telah menurun secara besar-besaran. Umpan balik dari pengujian akan dengan cepat menunjukkan apakah kode Anda berfungsi seperti yang diharapkan, jauh sebelum mendekati pengguna akhir, jadi mengapa membuang waktu menambahkan verbositas opsional?
B)
Pemrogram yang malas akan melakukan apa saja untuk membuat hidup mereka lebih mudah dalam jangka pendek. Kurang mengetik -> kurang usaha -> lebih mudah. (juga, tidak harus titik koma akan menghindari ketegangan jari tangan kanan Anda, menghindari RSIness).
(NB Saya tidak setuju dengan gagasan menghilangkan sesuatu yang merusak pernyataan).
sumber
\n
dan;\n
samaSaya tidak meninggalkannya, tetapi saya mengubah aturan kapan memasukkannya.
Aturan yang digunakan kebanyakan orang adalah
}
datang dari pernyataan fungsiAturan saya adalah: Di awal setiap baris dimulai dengan brace pembuka / braket.
Milik saya lebih sederhana, karena itu lebih mudah diikuti dan lebih rentan terhadap bug. Juga rendahnya jumlah titik koma membuatnya mudah untuk menemukan bug yang dibuat dengan meninggalkannya.
Argumen lain adalah bahwa
return\nvalue
bug terkenal berasal dari tidak mengetahui tentang ASI. Aturan saya memaksa Anda untuk mengetahui tentang ASI, sehingga orang yang menggunakan aturan saya cenderung tidak akan jatuh ke dalam perangkap bug itu.sumber
Hitungan Byte. Soalnya, orang jahat biasanya mencoba memasukkan begitu banyak ke dalam satu baris kode. Secara teknis, ini tidak akan mungkin terjadi tanpa semi-titik dua. Anggapan saya adalah bahwa ini lebih merupakan tindakan pengamanan daripada sekadar persyaratan terprogram. Entah bagaimana, ini akan secara signifikan mengurangi XSS ketika itu menjadi persyaratan daripada saran.
sumber