Topik dalam bagian terjemahan tutorial JavaScript ini adalah penanganan perkecualian, fitur titik koma otomatis, dan literal templat.
โ 
Bagian 1: program pertama, fitur bahasa, standarโ 
Bagian 2: gaya kode dan struktur programโ 
Bagian 3: variabel, tipe data, ekspresi, objekโ 
Bagian 4: fiturโ 
Bagian 5: array dan loopโ 
Bagian 6: pengecualian, titik koma, literal wildcardโ 
Bagian 7: mode ketat, kata kunci ini, acara, modul, perhitungan matematisโ 
Bagian 8: Tinjauan Umum Fitur ES6โ 
Bagian 9: Gambaran Umum Standar ES7, ES8, dan ES9
Penanganan pengecualian
Ketika masalah terjadi selama eksekusi kode, itu dinyatakan sebagai pengecualian dalam JavaScript. Jika Anda tidak mengambil tindakan untuk menangani pengecualian, maka, ketika itu terjadi, program berhenti, dan pesan kesalahan ditampilkan di konsol.
Pertimbangkan potongan kode berikut.
let obj = {value: 'message text'} let notObj let fn = (a) => a.value console.log(fn(obj))  
Di sini kita memiliki fungsi yang kami rencanakan untuk digunakan untuk memproses objek yang memiliki properti 
value . Dia mengembalikan properti ini. Jika Anda menggunakan fungsi ini untuk tujuan yang dimaksudkan, yaitu, untuk mentransfer ke sana objek yang dirancang untuk bekerja dengannya, tidak ada kesalahan akan dihasilkan saat dijalankan. Tetapi jika Anda mengirimkan sesuatu yang tidak pantas untuk itu, dalam kasus kami, variabel yang dinyatakan tetapi tidak diinisialisasi, maka kesalahan terjadi ketika Anda mencoba mengakses properti 
value dari nilai yang 
undefined . Pesan kesalahan akan muncul di konsol, eksekusi program akan berhenti.
Begini tampilannya saat Anda menjalankan kode ini di Node.js.
Pengecualian TypeError di Node.jsJika sesuatu seperti ini terjadi pada kode JS halaman web, pesan serupa akan dikirim ke konsol browser. Jika ini terjadi dalam program nyata, katakanlah - dalam kode server web, perilaku ini sangat tidak diinginkan. Alangkah baiknya memiliki mekanisme yang memungkinkan, tanpa menghentikan program, untuk menangkap kesalahan, dan kemudian mengambil tindakan untuk memperbaikinya. Mekanisme semacam itu ada dalam JavaScript, diwakili oleh 
try...catch construct.
โbangun coba ... tangkap
try...catch konstruk memungkinkan Anda untuk menangkap dan menangani pengecualian. Yaitu, itu termasuk blok 
try , yang mencakup kode yang dapat menyebabkan kesalahan, dan 
catch , di mana kontrol ditransfer ketika kesalahan terjadi. 
try blok tidak benar-benar memasukkan semua kode program. Bagian-bagian itu yang dapat menyebabkan kesalahan runtime ditempatkan di sana. Misalnya, panggilan ke fungsi yang harus bekerja dengan data tertentu yang diterima dari sumber eksternal. Jika struktur data tersebut berbeda dari yang diharapkan fungsi, kesalahan dapat terjadi. Inilah yang 
try...catch diagram desain terlihat.
 try {  
Jika kode dieksekusi tanpa kesalahan, 
catch (penangan pengecualian) tidak dieksekusi. Jika kesalahan terjadi, objek kesalahan ditransfer di sana dan beberapa tindakan diambil untuk memerangi kesalahan ini.
Kami menerapkan konstruksi ini dalam contoh kami, melindungi dengan bantuannya bagian-bagian berbahaya dari program - yang mana fungsi 
fn() dipanggil.
 let obj = {value: 'message text'} let notObj let fn = (a) => a.value try {   console.log(fn(obj)) } catch (e) {   console.log(e.message) } console.log('Before')  
Mari kita lihat hasil dari mengeksekusi kode ini di Node.js.
Penanganan Kesalahan di Node.jsSeperti yang Anda lihat, jika Anda membandingkan contoh ini dengan yang sebelumnya, sekarang semua kode dieksekusi, dan yang terletak sebelum baris masalah, dan yang terletak setelahnya. Kami "memproses" kesalahan dengan hanya mencetak ke konsol nilai properti 
message objek 
Kesalahan . Apa yang akan menjadi penanganan kesalahan yang terjadi dalam kode yang sebenarnya digunakan tergantung pada kesalahan.
Kami membahas 
try...catch blok di atas, tetapi, pada kenyataannya, konstruksi ini termasuk blok lain - 
finally .
โ akhirnya diblokir
Blok 
finally berisi kode yang berjalan terlepas dari ada atau tidaknya kesalahan dalam kode yang berjalan di blok 
try . Ini tampilannya.
 try {  
Blok 
finally juga dapat digunakan jika 
try...catch...finally blok tidak memiliki 
catch . Dalam pendekatan ini, digunakan dengan cara yang sama seperti dalam konstruksi dengan 
catch , misalnya, untuk membebaskan sumber daya yang ditempati di blok 
try .
โ Blok percobaan bersarang
Coba blok bisa bersarang bersama. Dalam hal ini, pengecualian ditangani di 
catch terdekat.
 try {  
Dalam hal ini, jika pengecualian terjadi di blok 
try internal, itu akan diproses di 
catch eksternal.
Exception Pengecualian yang dihasilkan sendiri
Pengecualian dapat dilempar sendiri menggunakan pernyataan 
throw . Ini tampilannya.
 throw value 
Setelah instruksi ini dijalankan, kontrol dipindahkan ke 
catch terdekat, atau jika blok tersebut tidak dapat ditemukan, program berhenti. Nilai pengecualian bisa berupa apa saja. Misalnya, objek kesalahan yang ditentukan pengguna.
Tentang titik koma
Menggunakan titik koma dalam JavaScript adalah opsional. Beberapa programmer melakukan tanpa mereka, mengandalkan sistem pengaturan otomatis untuk mereka, dan menempatkan mereka hanya di tempat yang benar-benar diperlukan. Beberapa orang lebih suka menempatkannya sedapat mungkin. Penulis materi ini mengacu pada kategori programmer yang ingin melakukan tanpa titik koma. Dia mengatakan bahwa dia memutuskan untuk melakukannya tanpa mereka di musim gugur 2017 dengan menetapkan Prettier untuk menghapusnya di mana pun Anda dapat melakukannya tanpa penyisipan eksplisit mereka. Menurutnya, kode tanpa titik koma terlihat lebih alami dan lebih mudah dibaca.
Mungkin kita dapat mengatakan bahwa komunitas pengembang JS dibagi, dalam kaitannya dengan titik koma, menjadi dua kubu. Pada saat yang sama, ada juga panduan gaya JavaScript yang menentukan titik koma eksplisit, dan panduan yang merekomendasikan melakukannya tanpa mereka.
Semua ini dimungkinkan karena fakta bahwa JavaScript memiliki sistem untuk titik koma otomatis (Penyisipan Titik Koma Otomatis, ASI). Namun, fakta bahwa dalam kode JS, dalam banyak situasi, Anda dapat melakukannya tanpa karakter ini, dan fakta bahwa titik koma ditempatkan secara otomatis ketika menyiapkan kode untuk dieksekusi, tidak berarti bahwa pemrogram tidak perlu mengetahui aturan yang dengannya hal ini terjadi. Ketidaktahuan tentang aturan ini menyebabkan kesalahan.
โ Aturan untuk titik koma otomatis
JavaScript parser secara otomatis menambahkan titik koma saat mem-parsing teks program dalam situasi berikut:
- Ketika baris berikutnya dimulai dengan kode yang mengganggu kode saat ini (kode perintah tertentu mungkin terletak di beberapa baris).
- Ketika baris berikutnya dimulai dengan karakter }, yang menutup blok saat ini.
- Ketika akhir file dengan kode program terdeteksi.
- Sejalan dengan perintah return.
- Sejalan dengan perintah break.
- Sejalan dengan perintah throw.
- Sejalan dengan perintah continue.
โ Contoh kode yang tidak berfungsi seperti yang diharapkan
Berikut adalah beberapa contoh yang menggambarkan aturan di atas. Misalnya, menurut Anda apa yang akan ditampilkan sebagai hasil dari eksekusi fragmen kode berikut?
 const hey = 'hey' const you = 'hey' const heyYou = hey + ' ' + you ['h', 'e', 'y'].forEach((letter) => console.log(letter)) 
Ketika mencoba mengeksekusi kode ini, kesalahan 
Uncaught TypeError: Cannot read property 'forEach' of undefined akan 
Uncaught TypeError: Cannot read property 'forEach' of undefined sistem yang 
Uncaught TypeError: Cannot read property 'forEach' of undefined , berdasarkan aturan No. 1, ia mencoba menafsirkan kode sebagai berikut.
 const hey = 'hey'; const you = 'hey'; const heyYou = hey + ' ' + you['h', 'e', 'y'].forEach((letter) => console.log(letter)) 
Masalahnya dapat diselesaikan dengan meletakkan tanda koma setelah garis kedua dari belakang contoh pertama.
Ini potongan kode lain.
 (1 + 2).toString() 
Hasil eksekusi akan menjadi output dari string 
"3" . Tetapi apa yang terjadi jika sesuatu seperti ini muncul di cuplikan kode berikutnya?
 const a = 1 const b = 2 const c = a + b (a + b).toString() 
Dalam situasi ini, kesalahan 
TypeError: b is not a function akan muncul 
TypeError: b is not a function karena kode di atas akan ditafsirkan sebagai berikut.
 const a = 1 const b = 2 const c = a + b(a + b).toString() 
Mari kita lihat contoh berdasarkan aturan 4.
 (() => { return {   color: 'white' } })() 
Anda mungkin berpikir bahwa IIFE ini akan mengembalikan objek yang berisi properti 
color , tetapi kenyataannya tidak. Sebagai gantinya, fungsi akan kembali 
undefined karena sistem menambahkan tanda titik koma setelah perintah 
return .
Untuk memecahkan masalah yang sama, kurung buka objek literal harus ditempatkan pada baris yang sama dengan perintah 
return .
 (() => { return {   color: 'white' } })() 
Jika Anda melihat fragmen kode berikut, Anda mungkin berpikir bahwa itu akan menampilkan 
0 di kotak pesan.
 1 + 1 -1 + 1 === 0 ? alert(0) : alert(2) 
Tetapi menghasilkan 2, karena, sesuai dengan aturan No. 1, kode ini direpresentasikan sebagai berikut.
 1 + 1 -1 + 1 === 0 ? alert(0) : alert(2) 
Anda harus berhati-hati saat menggunakan titik koma di JavaScript. Anda dapat bertemu dengan kedua pendukung titik koma yang bersemangat, dan lawan mereka. Bahkan, ketika memutuskan apakah titik koma diperlukan dalam kode Anda, Anda dapat mengandalkan fakta bahwa JS mendukung substitusi otomatis mereka, tetapi semua orang harus memutuskan sendiri apakah mereka diperlukan dalam kode-nya atau tidak. Hal utama adalah menerapkan pendekatan yang dipilih secara konsisten dan masuk akal. Mengenai penempatan titik koma dan struktur kode, kami dapat merekomendasikan aturan berikut:
- Dengan menggunakan perintah return, atur apa yang seharusnya kembali dari fungsi pada baris yang sama dengan perintah. Hal yang sama berlaku untuk perintahbreak,throw,continue.
- Berikan perhatian khusus pada situasi di mana baris kode baru dimulai dengan braket, karena baris ini dapat secara otomatis dikombinasikan dengan yang sebelumnya dan disajikan oleh sistem sebagai upaya untuk memanggil fungsi atau upaya untuk mengakses elemen array.
Secara umum, dapat dikatakan bahwa apakah Anda menempatkan titik koma sendiri, atau mengandalkan penempatan otomatisnya, uji kodenya untuk memastikan bahwa itu berfungsi persis seperti yang diharapkan.
Tanda kutip dan wildcard literals
Mari kita bicara tentang fitur menggunakan tanda kutip dalam JavaScript. Yaitu, kita berbicara tentang jenis kutipan berikut yang diizinkan dalam program JS:
- Kutipan tunggal.
- Kutipan ganda.
- Kutipan kembali.
Kutipan tunggal dan ganda, secara umum, dapat dianggap sama.
 const test = 'test' const bike = "bike" 
Praktis tidak ada perbedaan di antara mereka. Mungkin satu-satunya perbedaan yang nyata adalah bahwa dalam string yang diapit dengan tanda kutip tunggal, Anda harus keluar dari karakter tanda kutip tunggal, dan dalam string yang diapit dengan tanda kutip ganda, karakternya menjadi ganda.
 const test = 'test' const test = 'te\'st' const test = 'te"st' const test = "te\"st" const test = "te'st" 
Dalam panduan gaya yang berbeda, Anda dapat menemukan rekomendasi untuk menggunakan tanda kutip tunggal dan rekomendasi untuk menggunakan tanda kutip ganda. Penulis materi ini mengatakan bahwa dalam JS-code ia berusaha untuk menggunakan tanda kutip tunggal secara eksklusif, menggunakan tanda kutip ganda hanya dalam kode HTML.
Backticks muncul dalam JavaScript dengan merilis standar ES6 pada tahun 2015. Mereka, di antara fitur-fitur baru lainnya, memungkinkan untuk dengan mudah menggambarkan string multi-line. String semacam itu juga dapat ditentukan menggunakan tanda kutip reguler - menggunakan urutan escape 
\n . Ini terlihat seperti ini.
 const multilineString = 'A string\non multiple lines' 
Koma terbalik (biasanya tombol untuk memasukkannya terletak di sebelah kiri tombol angka 1 pada keyboard) lakukan tanpa 
\n .
 const multilineString = `A string on multiple lines` 
Tetapi kemungkinan backquote tidak terbatas pada ini. Jadi, jika sebuah string dideskripsikan menggunakan backquotes, dimungkinkan untuk mengganti nilai-nilai dari perhitungan JS-expressions ke dalamnya menggunakan konstruksi 
${} .
 const multilineString = `A string on ${1+1} lines` 
String semacam itu disebut templat literal.
Literal templat memiliki fitur berikut:
- Mereka mendukung teks multi-baris.
- Mereka memungkinkan untuk menyisipkan string, ekspresi bawaan dapat digunakan di dalamnya.
- Mereka memungkinkan Anda untuk bekerja dengan templat yang ditandai, memungkinkan untuk membuat bahasa spesifik domain Anda sendiri (DSL, Bahasa Khusus Domain).
Mari kita bicara tentang fitur-fitur ini.
โMultiline text
Saat mengatur teks multisaluran dengan tanda kutip belakang, Anda harus ingat bahwa spasi dalam teks tersebut sama pentingnya dengan karakter lain. Misalnya, pertimbangkan teks multiline berikut.
 const string = `First               Second` 
Kesimpulannya akan memberikan kira-kira berikut ini.
 First               Second 
Artinya, ternyata bahwa ketika teks ini dimasukkan dalam editor, maka mungkin programmer berharap bahwa kata-kata 
First dan 
Second , ketika menghasilkan, akan muncul satu sama lain, tetapi kenyataannya tidak demikian. Untuk mengatasi masalah ini, Anda dapat memulai teks multiline dengan umpan baris, dan, segera setelah menutup tanda kutip belakang, panggil metode 
trim() , yang akan menghapus spasi putih di awal atau akhir baris. Karakter seperti itu, khususnya, termasuk spasi dan tab. Karakter akhir baris juga akan dihapus.
Ini terlihat seperti ini.
 const string = ` First Second`.trim() 
โ Interpolasi
Yang dimaksud dengan interpolasi adalah konversi variabel dan ekspresi menjadi string. Ini dilakukan menggunakan konstruk 
${} .
 const variable = 'test' const string = `something ${ variable }`  
Anda dapat menambahkan apa pun ke blok 
${} - bahkan ekspresi.
 const string = `something ${1 + 2 + 3}` const string2 = `something ${foo() ? 'x' : 'y' }` 
Teks 
something 6 akan masuk ke 
string konstan, baik teks 
something x atau teks 
something y akan ditulis ke 
string string2 . Itu tergantung pada apakah fungsi 
foo() mengembalikan true atau false (operator ternary digunakan di sini, yang, jika apa yang sebelum tanda tanya itu benar, mengembalikan apa yang muncul setelah tanda tanya, sebaliknya mengembalikan apa datang setelah usus besar).
โTagged Templates
Template tagged digunakan di banyak perpustakaan populer. Diantaranya adalah 
Styled Components , 
Apollo , 
GraphQL .
Apa yang dihasilkan oleh pola seperti itu tergantung pada beberapa logika yang didefinisikan oleh fungsi. Berikut adalah contoh yang sedikit direvisi dalam salah satu 
publikasi kami yang menggambarkan cara bekerja dengan string templat yang ditandai.
 const esth = 8 function helper(strs, ...keys) { const str1 = strs[0]  
Di sini, jika angka 
8 ditulis dalam konstanta 
esth , garis 
ES 8 is awesome akan berada di 
es . Kalau tidak, akan ada baris lain. Misalnya, jika 
esth angka 
6 , maka 
ES 6 is good .
Komponen yang Ditata menggunakan templat yang ditandai untuk menentukan string CSS.
 const Button = styled.button` font-size: 1.5em; background-color: black; color: white; `; 
Di Apollo, mereka digunakan untuk mendefinisikan permintaan GraphQL.
 const query = gql` query {   ... } ` 
Mengetahui cara kerja templat yang ditandai, mudah untuk memahami bahwa 
styled.button dan 
gql dari contoh sebelumnya hanyalah fungsi.
 function gql(literals, ...expressions) { } 
Sebagai contoh, fungsi 
gql() mengembalikan string yang mungkin merupakan hasil dari perhitungan apa pun. Parameter 
literals dari fungsi ini adalah array yang berisi konten templat literal yang dibagi menjadi beberapa bagian, ekspresi berisi hasil evaluasi ekspresi.
Mari kita uraikan baris berikutnya.
 const string = helper`something ${1 + 2 + 3} ` 
Fungsi 
helper mendapatkan array 
literals berisi dua elemen. Di yang pertama akan ada teks 
something dengan spasi setelahnya, di yang kedua akan ada baris kosong - yaitu, apa yang ada di antara ekspresi 
${1 + 2 + 3} dan akhir baris. Akan ada satu elemen dalam array 
espressions - 
6 .
Ini adalah contoh yang lebih kompleks.
 const string = helper`something another ${'x'} new line ${1 + 2 + 3} test` 
Di sini, di fungsi 
helper , array berikutnya akan menjadi parameter pertama.
 [ 'something\nanother ', '\nnew line ', '\ntest' ] 
Array kedua akan terlihat seperti ini.
 [ 'x', 6 ] 
Ringkasan
Hari ini kita berbicara tentang penanganan pengecualian, tentang substitusi otomatis titik koma, dan tentang literal templat dalam JavaScript. Lain kali kita akan melihat beberapa konsep bahasa yang lebih penting. Secara khusus - bekerja dalam mode ketat, timer, perhitungan matematis.
Pembaca yang budiman! Apakah Anda menggunakan kemampuan templat yang ditandai dalam JavaScript?
