Javascript memiliki fitur yang disebut Penyisipan Titik Koma Otomatis di mana pada dasarnya jika parser menemukan token yang tidak valid, dan token terakhir sebelum itu adalah garis putus, maka parser akan menyisipkan titik koma di mana linebreak berada. Ini memungkinkan Anda untuk pada dasarnya menulis semua kode javascript Anda tanpa titik koma, tetapi Anda harus mengetahui beberapa kasus tepi, sebagian besar jika Anda memiliki kata kunci kembali dan kemudian nilai yang ingin Anda kembalikan pada baris baru.
function test(){
// This will return 'undefined', because return is a valid statement
// and "john" is a valid statement on its own.
return
"john"
}
Karena gotcha ini ada puluhan artikel dengan judul seperti 'Penyisipan titik koma otomatis adalah Jahat', 'Selalu gunakan titik koma dalam Javascript' dll.
Tetapi dalam Python tidak ada yang pernah menggunakan titik koma dan memiliki gotcha yang persis sama.
def test():
# This will return 'undefined', because return is a valid statement
# and "john" is a valid statement on its own.
return
"john"
Kerjanya persis sama, namun tidak ada yang sangat takut dengan perilaku Python.
Saya pikir kasus di mana javascript berperilaku buruk cukup sedikit sehingga Anda harus dapat menghindarinya dengan mudah. Kembali + nilai pada baris baru? Apakah orang benar-benar melakukan itu?
Ada pendapat? Apakah Anda menggunakan titik koma di javascript dan mengapa?
sumber
#
, bukan `// '.Jawaban:
Alasannya adalah bahwa dalam Python, baris baru adalah cara yang jelas untuk memisahkan baris kode; ini adalah dengan desain, dan cara kerjanya telah dipikirkan secara menyeluruh. Sebagai hasilnya, kode python dapat dibaca dengan sempurna dan tidak ambigu tanpa penanda akhir pernyataan khusus (terlepas dari baris baru).
Javascript, di sisi lain, dirancang dengan sintaks mirip C dalam pikiran, di mana pernyataan selalu diakhiri dengan tanda titik koma. Untuk membuat bahasa lebih toleran terhadap kesalahan, ia mencoba menebak ke mana titik koma tambahan harus dibuat untuk membuat kode yang benar. Karena ini semacam retro-dipasang ke sintaks seperti C, itu tidak selalu berfungsi seperti yang diharapkan (kadang-kadang, penerjemah skrip menebak salah), dan dapat membuat kode yang cukup kontra-intuitif. \
Atau, berdebat dalam istilah "eksplisit lebih baik daripada implisit": Dalam Python, baris baru sudah sepenuhnya eksplisit, sedangkan dalam Javascript, ambigu, jadi Anda menambahkan tanda titik koma untuk membuatnya eksplisit.
sumber
Ada perbedaan yang cukup mendasar dari cara kerjanya di Python, saya pikir. Mengutip dari pos Einar Egilsson ditautkan ke: "tanda titik koma tidak tersirat pada akhir baris jika token pertama dari baris berikutnya dapat diuraikan sebagai bagian dari pernyataan yang sama".
Dalam Python, pemisah baris selalu mengakhiri pernyataan, kecuali dalam kasus-kasus tertentu yang cukup jelas seperti di dalam tanda kurung. Sebaliknya, JavaScript akan mencoba mem-parsing sebanyak mungkin baris sebelum mengakhiri pernyataan, yang berpotensi mengarah ke hal-hal seperti ini:
sumber
(a + 1) ? do_something() : do_something_else();
dan tiba-tiba, area diatur ke nilai kembalido_something()
ataudo_something_else()
dan Anda akan sangat bingung.Saya sering meminimalkan JS-Files saya dalam mode produksi. Berarti, menghapus komentar dan linebreak.
Tanpa menggunakan titik koma, itu akan merusak Javascript saya.
sumber
Itu tidak berfungsi seperti yang Anda gambarkan.
Ini salah. Contoh:
1
adalah token yang benar-benar valid, tetapi parser akan tetap memasukkan tanda titik koma langsung setelahnyareturn
.Seperti yang Anda lihat, bahkan Anda tidak tahu persis di mana titik koma akan terjadi.
Masalah dengan penyisipan otomatis ada dua:
Tentu saja, menggunakan titik koma setelah setiap pernyataan hanya membantu dengan sumber kesalahan pertama.
Dalam hal apapun, seperti yang Anda duga sekarang, saya percaya bahwa penyisipan titik koma otomatis dalam sintaksis mirip-C adalah ide yang buruk.
sumber
Saya akan menyatakan satu alasan sederhana:
Javascript terlihat "agak java-ish" atau "agak C-ish". Tentu saja itu bahasa yang dinamis sehingga terlihat berbeda ... tetapi hadapi itu - Ada kawat gigi. Bahasa dengan kawat gigi umumnya memiliki titik koma. Refleks alami menendang dan membuat jari Anda mengarah ke tombol titik koma sebelum Anda menekan Enter.
Python, sebaliknya, bahkan sekilas terlihat sangat berbeda. Oleh karena itu, sedikit atau tidak ada analogi dengan "bahasa standar membosankan" secara intuitif dibentuk dan ketika seseorang memasuki "mode python", kurangnya titik koma menjadi alami.
sumber
Ada sejumlah alasan bagus untuk tidak menggunakan penyisipan semi-usus besar dalam JavaScript.
Terutama itu karena penyisipan semi-kolon sebagaimana didefinisikan dalam standar ECMAScript tidak intuitif untuk beberapa kasus. @Svante menunjukkan kasus di
return
mana penggunaan baris baru akan menyebabkan masalah.Yang tidak dia sebutkan adalah bahwa itu akan menyebabkan masalah jika Anda menggunakan semi-titik dua juga, karena penyisipan semi-titik dua terjadi apakah Anda menginginkannya atau tidak.
Alasan lain yang sangat bagus untuk tidak menggunakan penyisipan semi-kolon adalah kontrol output. Dalam banyak kasus, JavaScript dijalankan melalui minifier sebelum digunakan dalam produksi. Beberapa minifiers mungkin menangani kasus penyisipan semi-kolon otomatis, tapi saya tidak melihat alasan untuk mengandalkannya bekerja dengan sempurna
Selain itu untuk sistem manajemen konten, JavaScript sebaris mungkin diperkecil secara otomatis, dan saya telah melihat sejumlah kasus di mana penjelas otomatis hanya menghapus komentar dan memotong spasi putih (termasuk baris baru) dari awal dan akhir setiap baris.
Bagi penulis yang tidak memiliki pilihan alat apa yang dipilih, jauh lebih mudah untuk hanya berpegang pada format yang berfungsi di sebagian besar kasus.
sumber
Tidak menggunakan titik koma adalah resep untuk kegagalan ketika Anda mengecilkan file Anda file JavaScript. Itu sebabnya saya takut akan hal itu.
sumber
Dalam Javascript, Anda dapat menulis program yang secara sintaksis benar tanpa adanya penyisipan titik koma otomatis, dan ASI akan mengubah program itu menjadi program yang benar secara sintaksis yang berbeda (misalnya, mengubah kode yang mengembalikan nilai menjadi kode yang tidak menghasilkan apa-apa). Tidak ada kasus analog dengan Python. Dengan Python baris baru apa pun yang bisa mengakhiri pernyataan akan mengakhiri pernyataan, kecuali jika lolos dengan garis miring terbalik. Secara teknis, saya kira aturan Javascript sama-sama deterministik, tapi saya tidak tahu apakah Anda bisa meringkas aturan Javascript untuk mengakhiri pernyataan dalam satu kalimat.
sumber
Dalam kebanyakan kasus, ASI JavaScript menangani hal-hal seperti yang diharapkan. Salah satu contoh ASI yang mungkin tidak berlaku seperti yang Anda harapkan adalah ini:
Ini akan ditafsirkan sebagai memanggil fungsi
0
dengan fungsi anonim, kemudian mengeksekusi hasilnya. Dalam hal ini Anda mungkin ingin melakukan tugas, lalu segera jalankan fungsi anonim.Untuk seseorang yang tidak terbiasa dengan ASI bisa sangat membingungkan ketika Anda mengalami masalah seperti ini, jadi saya selalu merekomendasikan pengembang di tim saya untuk menggunakan titik koma.
(Sebagai tambahan: Saya tidak menggunakan titik koma ketika mengerjakan proyek pribadi / sisi karena saya tahu tidak ada orang lain yang perlu mempertahankan kode.)
sumber
Seperti Anda, saya pikir itu agak paranoid. Aturan untuk penyisipan titik koma didefinisikan dengan baik dalam JavaScript, seperti halnya dalam Python dan CoffeeScript. Tidak ada yang membuang Python atau CoffeeScript dengan titik koma, jadi mengapa JavaScript diperlakukan berbeda?
Saya pikir ini merupakan reaksi berlebihan terhadap kondisi buruk kode JavaScript tipikal dari sekitar sepuluh tahun yang lalu — JavaScript dipandang sebagai bahasa yang lemah, bermasalah, jelek, tidak baik. Itu memalukan. Anda tidak mungkin menulis kode yang baik dalam JavaScript!
Kemudian, orang-orang datang dan mencoba membuktikan bahwa Anda dapat menulis kode yang indah dan jelas dalam JavaScript. Aturan " selalu gunakan titik koma" adalah bagian dari wave ini. Dan sejujurnya, itu bisa membuat beberapa situasi sedikit lebih jelas.
Mengapa JavaScript masih diperlakukan berbeda?
Ada kelembaman. Dan tidak boleh diabaikan bahwa orang yang menghargai kode terstruktur secara eksplisit sering lebih suka bahasa gaya-C. Orang yang menghargai kode terstruktur tersirat sering berpindah ke bahasa non-C-style (seperti CoffeeScript).
sumber
Saya menggunakannya dalam Javascript secara ketat untuk konsistensi. Jika sebagian besar garis memiliki
Python memiliki mereka untuk kasus tepi seperti beberapa pernyataan pada satu baris, javascript memilikinya dan karena Anda akan menemukan mereka secara teratur digunakan saya sesuai dengan norma di mana mereka digunakan.
Saya tidak dapat menemukan penggunaan untuk beberapa pernyataan pada baris yang sama dan karena itu jangan melihat menggunakan titik koma.
sumber
Jika Anda menggunakan sesuatu seperti bundle-fu, dan manajer aset untuk aplikasi web Anda di rails, maka itu akan rusak parah jika tidak menemukan tanda titik koma di akhir token dalam javascript. Jadi, ini adalah praktik yang baik untuk menerapkannya.
sumber
Saya tidak ingat versi IE mana yang tepat, tetapi ada beberapa kasus di mana IE akan benar-benar keluar jika titik koma tidak ada. IIRC ketika Anda memiliki sesuatu dalam lingkup global seperti:
Jika Anda tidak menambahkan; setelah kurung kurawal, program akan benar-benar gagal pada beberapa versi IE. Itu, bersama dengan alasan lain (termasuk rekomendasi Crockford untuk selalu menggunakannya secara eksplisit) telah mendorong saya untuk selalu menggunakannya secara eksplisit dalam setiap kasus.
sumber