Kesalahan JavaScript terbagi dalam tiga kategori berbeda - sintaks, runtime, dan logika - dan alat yang tepat untuk menemukan masing-masing berbeda. Pemeriksa sintaks menangkap masalah struktural sebelum mesin bahkan menjalankan kode Anda; dekoder kesalahan runtime menjelaskan pesan kesalahan samar setelah muncul; penganalisis statis menemukan bug potensial yang tidak tersentuh kedua pendekatan itu. Panduan ini memetakan setiap kategori kesalahan JavaScript ke alat terbaik untuk menangkapnya, dengan alur kerja untuk browser, Node.js, dan pipeline CI/CD.
Jenis-jenis kesalahan JavaScript
Setiap kesalahan JavaScript yang Anda temui termasuk salah satu dari tiga kategori, dan mencampurnya berujung pada penggunaan alat yang salah. Memahami kategorinya lebih dulu menghemat waktu debugging yang signifikan karena memberi tahu Anda persis di mana harus mencari dan jenis pemeriksa apa yang akan membantu.
Kesalahan sintaks
Kesalahan sintaks tertangkap oleh parser JavaScript sebelum satu baris kode pun berjalan. Artinya, mesin tidak dapat menafsirkan struktur file - kurung kurawal penutup yang hilang, token tak terduga, kata kunci yang dipakai sebagai nama variabel, atau string literal yang tidak ditutup. Kesalahan dilempar saat penguraian dengan nomor baris dan deskripsi singkat. Pemeriksa atau validator sintaks menangkapnya tanpa menjalankan kode.
Kesalahan runtime
Kesalahan runtime dilempar saat eksekusi ketika kode yang valid secara sintaks mencoba melakukan operasi ilegal. Yang paling umum: mengakses properti pada `null` atau `undefined` (`TypeError`), memanggil sesuatu yang bukan fungsi (`TypeError`), merujuk variabel yang tidak ada (`ReferenceError`), atau membagi dengan nilai non-numerik (`NaN` - yang gagal secara diam-diam). Kesalahan-kesalahan ini butuh lingkungan yang berjalan, dekoder stack trace, atau analisis statis yang cermat untuk tertangkap.
Kesalahan logika
Kesalahan logika menghasilkan keluaran yang salah tanpa melempar kesalahan apa pun - loop yang meleset satu, kondisional yang keliru, mutasi padahal yang dimaksud salinan. Tidak ada validator atau pemeriksa sintaks yang mendeteksi ini; diperlukan unit test, code review, atau sesi debugger. Kumpulan aturan ESLint tumpang tindih dengan beberapa pola kesalahan logika (mis. menandai `==` alih-alih `===`), tetapi sebagian besar bug logika hanya ditemukan dengan menjalankan kode dengan data nyata.
- SyntaxError: Terdeteksi saat penguraian - kurung hilang, token buruk, string tak tertutup.
- TypeError: Mengakses `.property` pada null/undefined, memanggil yang bukan fungsi.
- ReferenceError: Memakai variabel yang tidak pernah dideklarasikan dalam scope saat ini.
- RangeError: Meneruskan nilai di luar rentang yang diizinkan - mis. `new Array(-1)`.
- URIError: URI rusak diteruskan ke `decodeURIComponent` atau `encodeURIComponent`.
- Bug logika: Keluaran salah, tanpa kesalahan dilempar - butuh test atau debugger.
Note
Pemeriksa sintaks JavaScript
Pemeriksa sintaks JavaScript (juga disebut validator sintaks) mengurai kode Anda tanpa mengeksekusinya dan melaporkan setiap tempat struktur melanggar tata bahasa JavaScript. Ini pemeriksaan pertama yang tercepat dan teraman - menangkap kesalahan yang akan mencegah kode Anda berjalan sama sekali, dan melakukannya dalam milidetik tanpa efek samping.
Kapan menggunakan pemeriksa sintaks
Pemeriksa sintaks berguna dalam empat situasi: ketika Anda menerima JavaScript dari pihak ketiga (file hasil generate, potongan dari dokumentasi, atau kode yang ditempel kolega), ketika Anda men-debug skrip yang gagal diam-diam pada build minified, ketika Anda menulis JavaScript di editor tanpa dukungan language server, dan ketika Anda ingin pemeriksaan kewarasan cepat sebelum commit file yang banyak Anda sunting.
Apa yang tertangkap dan tidak oleh pemeriksa sintaks
| Pemeriksaan | Validator sintaks | ESLint | Compiler TypeScript |
|---|---|---|---|
| Kurung/kurawal penutup hilang | ✓ Ya | ✓ Ya | ✓ Ya |
| Token tak terduga / sintaks buruk | ✓ Ya | ✓ Ya | ✓ Ya |
| Referensi variabel tidak terdefinisi | ✗ Tidak | ✓ Dengan aturan no-undef | ✓ Ya (strict) |
| Ketidakcocokan tipe | ✗ Tidak | ✗ Tidak | ✓ Ya |
| Peringatan variabel tak terpakai | ✗ Tidak | ✓ no-unused-vars | ✓ noUnusedLocals |
| await hilang pada panggilan async | ✗ Tidak | ✓ no-floating-promises | ✓ Ya |
| Logika / keluaran salah | ✗ Tidak | ✗ Tidak | ✗ Tidak |
Validator Sintaks JavaScript di Aback Tools berjalan sepenuhnya di browser Anda - tempel kode, klik validasi, dan setiap kesalahan sintaks disorot dengan nomor baris serta pesan parser dalam waktu kurang dari satu detik. Kode Anda tidak pernah diunggah ke server, sehingga aman untuk skrip proprietary, tooling internal, dan kode aplikasi rahasia.
Validator Sintaks JavaScript
Periksa kode JavaScript dari kesalahan sintaks secara instan - parser lokal di browser, diagnostik tingkat baris, tanpa unggahan.
Kesalahan runtime dan stack traces
Kesalahan runtime datang sebagai exception yang dilempar dengan jenis, pesan, dan stack trace. Membacanya secara efisien adalah keterampilan yang membedakan debugger yang cepat dari yang lambat. Jenis kesalahan langsung mempersempit penyebab; stack trace menunjuk jalur eksekusi tepat yang mengarah ke sana.
Cara membaca stack trace JavaScript
Stack trace adalah daftar panggilan fungsi dalam urutan terbalik - panggilan terbaru di atas, titik masuk di bawah. Setiap baris menampilkan nama fungsi, jalur file, dan nomor `line:column`. Mulai dari atas trace dan pindai ke bawah sampai menemukan baris pertama yang merujuk kode Anda sendiri (bukan pustaka seperti React, Express, atau lodash). Itulah panggilan yang memicu kesalahan. Baris-baris di atasnya menunjukkan bagaimana Anda sampai ke sana.
TypeError: Cannot read properties of undefined (reading 'name')
at formatUser (app.js:24:18) // ← kode Anda - mulai di sini
at renderCard (components.js:51:5) // ← kode Anda - rantai panggilan
at Array.map (<anonymous>)
at buildList (components.js:44:20)
at App (app.js:12:15)
at React.createElement ...Baris pertama menamai jenis kesalahan (`TypeError`) dan properti spesifik yang gagal (`name`). Baris `app.js:24:18` adalah tempat akses properti terjadi. Menuju baris itu - `user.name` dengan `user` undefined - dan tambahkan pengaman yang sesuai: optional chaining (`user?.name`), pemeriksaan null, atau nilai default. Penjelas Stack Trace JavaScript mengurai stack trace apa pun dan menghasilkan rincian terstruktur tentang asal, rantai panggilan, dan perbaikan yang paling mungkin secara otomatis.
Membaca pesan kesalahan runtime yang samar
Beberapa pesan kesalahan runtime lugas; lainnya terkenal tidak membantu. `"Maximum call stack size exceeded"` berarti rekursi tak berujung. `"Cannot set properties of null"` berarti Anda memanggil `.setAttribute()` atau sejenisnya pada elemen DOM yang belum ada. `"$ is not defined"` dalam konteks browser berarti jQuery tidak dimuat sebelum skrip yang menggunakannya. Dekoder Kesalahan Runtime JavaScript menerima pesan kesalahan apa pun dan mengembalikan penjelasan berbahasa sederhana dengan langkah perbaikan spesifik untuk pola-pola yang paling umum.
Tip
Dekoder Kesalahan Runtime JavaScript
Tempel pesan kesalahan JavaScript apa pun dan dapatkan penjelasan berbahasa sederhana dengan rekomendasi perbaikan yang tepat sasaran - tanpa perlu menyiapkan lingkungan.
ESLint dan analisis statis
ESLint adalah alat analisis statis standar industri untuk JavaScript dan TypeScript. Ia membaca kode sumber Anda tanpa mengeksekusinya dan menerapkan kumpulan aturan yang dapat dikonfigurasi yang menangkap masalah mulai dari kesalahan sintaks hingga anti-pola keamanan. Berbeda dari pemeriksa sintaks, ESLint memahami scope, siklus hidup variabel, dan graf impor - memungkinkannya menemukan bug yang tak terlihat oleh parser murni.
Apa yang ditangkap ESLint dan luput dari pemeriksa sintaks
- Variabel tak terdefinisi: Aturan `no-undef` menandai setiap variabel yang digunakan tanpa deklarasi dalam scope.
- Variabel tak terpakai: `no-unused-vars` mencegah penumpukan kode mati yang mengaburkan logika nyata.
- Kesetaraan tidak aman: `eqeqeq` mewajibkan `===` alih-alih `==`, menghilangkan bug koersi tipe.
- await hilang: `no-floating-promises` (via TypeScript ESLint) menangkap panggilan async yang tidak ditangani.
- Kode tak terjangkau: `no-unreachable` menandai pernyataan setelah `return` atau `throw`.
- Tanpa console di produksi: `no-console` mencegah log debug ikut ke produksi.
- Aturan keamanan: `eslint-plugin-security` menandai kerentanan injeksi potensial dan regex tidak aman.
Poin penting konfigurasi ESLint
Perilaku ESLint sepenuhnya digerakkan oleh file konfigurasinya - `.eslintrc.json`, `.eslintrc.js`, atau format flat config baru `eslint.config.js`. Konfigurasi menyatakan kumpulan aturan mana yang diperluas (`eslint:recommended`, `plugin:@typescript-eslint/recommended`, `plugin:react/recommended`) dan aturan individual mana yang diaktifkan, dinonaktifkan, atau disesuaikan. File ESLint yang salah konfigurasi dapat menonaktifkan aturan penting secara diam-diam - itulah mengapa memvalidasi konfigurasi itu sendiri penting. Validator Konfigurasi ESLint memeriksa file konfigurasi Anda dari kesalahan struktural dan konflik aturan sebelum Anda menjalankan lint.
Nilai ESLint bukan pada aturan yang Anda aktifkan - melainkan pada aturan yang disepakati tim Anda untuk ditegakkan secara konsisten. Konfigurasi bersama yang dikomit ke version control memastikan setiap pengembang melihat umpan balik yang sama.
Menjalankan ESLint untuk pertama kalinya
# Menginstal ESLint di proyek
npm install --save-dev eslint
# Menginisialisasi file konfigurasi secara interaktif
npx eslint --init
# Melint satu file
npx eslint src/app.js
# Melint direktori dan memperbaiki otomatis masalah yang aman
npx eslint src/ --fix
# Keluaran JSON untuk tooling CI
npx eslint src/ --format json > eslint-report.jsonNote
Debugging dengan DevTools browser
Chrome DevTools, Firefox Developer Tools, dan Safari Web Inspector menyediakan pengalaman debugging JavaScript terdalam yang tersedia - eksekusi langsung, breakpoint, inspeksi variabel, dan pelacakan permintaan jaringan. Untuk kesalahan runtime yang sulit direproduksi secara lokal, DevTools adalah lingkungan investigasi utama.
Panel Console
Tab Console menampilkan setiap pesan yang dicatat, peringatan, dan kesalahan yang dilempar secara real time. Kesalahan tampil merah dengan stack trace yang dapat dibentangkan. Mengklik referensi file:baris di kanan melompat langsung ke panel Sources pada lokasi itu. Klasifikator Kesalahan Konsol Browser melengkapi DevTools dengan mengategorikan kesalahan konsol berdasarkan jenis dan tingkat keparahan - berguna saat keluaran konsol panjang dan Anda perlu triase cepat.
Breakpoint dan panel Sources
Panel Sources memungkinkan Anda memasang breakpoint - menjeda eksekusi pada baris tertentu dan menginspeksi setiap variabel dalam scope pada saat itu. Klik bilangan baris di panel Sources untuk menambah breakpoint, lalu muat ulang halaman atau picu aksi yang menyebabkan kesalahan. Ketika eksekusi berhenti, arahkan kursor ke variabel apa pun untuk melihat nilainya saat ini, gunakan panel Call Stack untuk melihat bagaimana Anda sampai ke sana, dan langkahi kode baris demi baris dengan F10 (step over) atau F11 (step into).
Breakpoint kondisional dan logpoint
Klik kanan nomor baris mana pun di Sources untuk menambah breakpoint kondisional (berhenti hanya ketika kondisi benar, mis. `user.id === 42`) atau logpoint (mencatat nilai tanpa berhenti, seperti `console.log` yang tidak invasif). Keduanya sangat berguna untuk men-debug loop dan handler peristiwa di mana berhenti pada setiap iterasi tidak praktis.
| Pendekatan debugging | Paling cocok untuk | Menangkap kesalahan runtime | Menangkap kesalahan sintaks |
|---|---|---|---|
| Validator Sintaks JavaScript | Pemeriksaan statis pra-eksekusi | ✗ Tidak | ✓ Ya |
| ESLint | Analisis statis, CI/CD | ⚠ Sebagian | ✓ Ya |
| Console DevTools browser | Kesalahan browser langsung | ✓ Ya | ✓ Ya |
| Breakpoint DevTools | Debugging interaktif | ✓ Ya | ✗ Tidak |
| Dekoder Kesalahan Runtime | Menjelaskan pesan kesalahan | ✓ Ya | ✗ Tidak |
| Penjelas Stack Trace | Menelusuri asal panggilan | ✓ Ya | ✗ Tidak |
| Node.js --inspect + Chrome | Debugging sisi server | ✓ Ya | ✓ Ya |
Pemeriksaan kesalahan di CI/CD
Pemeriksaan kesalahan manual selama pengembangan adalah praktik yang baik tetapi bukan jaminan. Mengotomatiskan pemeriksaan kesalahan JavaScript di pipeline CI/CD Anda memastikan tidak ada kesalahan sintaks, pelanggaran ESLint, atau kesalahan tipe yang bisa bergabung ke cabang utama - terlepas dari pengembang mana yang mengirim pull request atau apakah mereka menjalankan pemeriksaan secara lokal.
Gerbang kualitas CI minimal
name: JavaScript Quality
on:
pull_request:
paths: ['src/**/*.js', 'src/**/*.ts']
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- name: ESLint
run: npx eslint src/ --max-warnings 0
- name: TypeScript check
run: npx tsc --noEmitFlag `--max-warnings 0` memperlakukan peringatan ESLint sebagai kesalahan, memblokir merge. Pasangkan dengan `tsc --noEmit` untuk proyek TypeScript guna menangkap kesalahan tipe yang tidak terlihat oleh aturan ESLint. Kedua langkah keluar dengan kode non-nol saat gagal, yang membuat workflow GitHub Actions gagal dan mencegah pull request digabung sampai masalahnya diselesaikan.
Source maps untuk pelacakan kesalahan produksi
Ketika kesalahan JavaScript mencapai produksi dalam bundle minified, stack trace menampilkan nama file terkompresi dan nomor kolom yang tidak berguna tanpa source map. Source maps menautkan keluaran minified kembali ke file sumber asli. Sebelum deployment, validasi bahwa file source map Anda terstruktur dengan benar menggunakan Validator Source Map - source map yang rusak menghasilkan stack trace produksi yang tak terbaca dan memperlambat diagnosis insiden secara signifikan.
Warning
Praktik terbaik debugging
Kebiasaan pemeriksaan kesalahan yang baik mengurangi waktu debugging berkali lipat. Praktik-praktik ini berlaku entah Anda bekerja di browser, layanan Node.js, atau fungsi serverless.
Perbaiki kesalahan pertama, bukan semua kesalahan
Kesalahan sintaks JavaScript berjunta - satu kurung hilang di baris 10 bisa menghasilkan lima kesalahan yang dilaporkan di bawahnya saat parser kehilangan jejak struktur dokumen. Selalu perbaiki kesalahan yang dilaporkan paling atas terlebih dahulu, lalu jalankan lagi validator. Yang tampak lima bug sering kali satu. Ini berlaku sama untuk laporan ESLint dan keluaran compiler TypeScript.
Gunakan mode strict dan fitur bahasa modern
Menambahkan `"use strict"` ke file (atau menggunakan modul ES, yang selalu strict) mengubah kegagalan diam-diam menjadi kesalahan yang dilempar. Penugasan ke variabel yang tidak dideklarasikan diam-diam menciptakan global dalam mode sloppy; dalam mode strict ia melempar `ReferenceError` seketika. Optional chaining (`?.`), nullish coalescing (`??`), dan default destructuring array (`const [a = 0] = arr`) mengurangi area munculnya kesalahan `TypeError: Cannot read properties of undefined` secara signifikan.
Validasi data eksternal di batas sistem
Mayoritas exception `TypeError` runtime di produksi berasal dari data eksternal - respons API, masukan pengguna, atau nilai localStorage - yang tidak sesuai bentuk yang diharapkan. Validasi data masuk di batas sistem: gunakan validator skema seperti Zod atau Joi pada respons API, periksa nilai `localStorage` sebelum mengurainya sebagai JSON, dan jangan pernah menganggap sebuah field ada hanya karena ada di data uji Anda. Kalkulator Ukuran Heap JavaScript berguna saat kesalahan memori muncul - membantu memperkirakan apakah struktur data besar atau proses berjalan lama melebihi alokasi heap V8.
- Perbaiki kesalahan pertama lebih dulu: Kesalahan sintaks berjunta - satu masalah nyata menghasilkan beberapa yang dilaporkan.
- Aktifkan ESLint di editor Anda: Umpan balik inline real-time menangkap kesalahan saat Anda mengetik, bukan setelah commit.
- Gunakan TypeScript: Kesalahan tipe yang tertangkap saat kompilasi tidak bisa menjadi kesalahan runtime di produksi.
- Validasi data eksternal: Respons API dan masukan pengguna harus diperiksa sebelum digunakan, bukan dianggap benar.
- Tulis test yang fokus: Unit test untuk jalur kritis mengungkap kesalahan logika yang tak bisa dideteksi alat statis mana pun.
- Gunakan source maps: Stack trace produksi yang terbaca memangkas waktu respons insiden secara dramatis.
Tip
Key takeaways
- Kesalahan sintaks tertangkap sebelum eksekusi - gunakan Validator Sintaks JavaScript untuk pemeriksaan instan, lokal di browser, tanpa unggahan kode.
- Kesalahan runtime menghasilkan jenis dan stack trace - Dekoder Kesalahan Runtime JavaScript menjelaskan pesan kesalahan apa pun berbahasa sederhana dengan langkah perbaikan.
- ESLint menangkap masalah yang luput dari pemeriksa sintaks: variabel tak terdefinisi, kesetaraan tidak aman, impor tak terpakai, dan `await` yang hilang - validasi konfigurasi ESLint Anda dengan Validator Konfigurasi ESLint.
- Selalu perbaiki kesalahan yang dilaporkan paling atas lebih dulu - kesalahan sintaks berjunta dan satu masalah nyata menghasilkan beberapa yang dilaporkan.
- Tambahkan ESLint dan `tsc --noEmit` ke pipeline CI/CD Anda agar tidak ada kesalahan yang bergabung tanpa tertangkap, terlepas dari penyiapan lokal.
- Source maps penting untuk stack trace produksi yang terbaca - validasi dengan Validator Source Map sebelum deployment.
- Validasi data eksternal (respons API, masukan pengguna) di batas sistem untuk menghilangkan penyebab utama `TypeError: Cannot read properties of undefined` di produksi.