- Bab 12 dari 12
- 35 menit
- 1 latihan kode
- 4 soal kuis
JavaScript Modern: ES2016 sampai ES2023
Di bab ini (13 bagian)
- Tujuan
- JavaScript terus bertambah tiap tahun
- Method kecil yang menghemat banyak baris
- Dukungan browser dan transpiler
- async/await: Promise yang terbaca lurus
- Optional chaining dan nullish coalescing
- BigInt dan logical assignment
- Private field dan static block
- Array.at, Object.hasOwn, dan structuredClone
- Timeline ES2016 sampai ES2023
- Cheat sheet: kapan pakai apa
- Kesalahan umum
- Rangkuman
Tujuan bab ini
- Mengenal method baru array, string, number, dan object yang dipakai sehari-hari.
- Menulis kode asynchronous dengan
async/awaitdan menangani error dengantry/catch. - Memakai
?.,??, logical assignment, dan private field#dengan tepat. - Memahami peran transpiler dan urutan fitur dari ES2016 sampai ES2023.
JavaScript terus bertambah tiap tahun
Sejak ES2015 (ES6), komite TC39 merilis versi baru setiap tahun. Namanya mengikuti tahun: ES2016, ES2017, dan seterusnya. Tiap rilis biasanya kecil, tapi kalau dikumpulkan, cara menulis JavaScript sekarang terasa jauh lebih enak dibanding sepuluh tahun lalu. Bab ini merangkum yang paling sering kamu temui di kode nyata.
Method kecil yang menghemat banyak baris
Untuk objek, ada trio yang sangat berguna:
Pola entries lalu map lalu fromEntries adalah cara standar "memetakan" isi objek. Dari ES2019 juga ada flat dan flatMap:
Dukungan browser dan transpiler
Browser modern (Chrome, Firefox, Edge, Safari) dan Node.js sudah mendukung hampir semua fitur di bab ini secara native. Kalau proyekmu harus jalan di browser lama, ada Babel, sebuah transpiler yang menerjemahkan sintaks baru ke sintaks lama. Contohnya a?.b diubah menjadi pengecekan a == null ? undefined : a.b. Lalu bundler seperti Vite atau Webpack menggabungkan banyak modul menjadi file siap pakai. Situs seperti caniuse.com membantu mengecek fitur mana yang aman dipakai.
async/await: Promise yang terbaca lurus
async/await (ES2017) adalah gula sintaksis di atas Promise. Fungsi async selalu mengembalikan Promise, dan await menjeda fungsi itu sampai Promise selesai, tanpa membekukan sisa program.
Error dari Promise yang rejected bisa ditangkap dengan try/catch biasa, persis seperti kode synchronous:
Hati-hati dengan await berurutan untuk tugas yang tidak saling bergantung. Dua await berturut-turut berarti menunggu satu per satu. Kalau keduanya independen, jalankan paralel:
Satu lagi dari ES2022: top-level await. Di dalam modul (bukan script biasa), await boleh dipakai langsung di luar fungsi.
Optional chaining dan nullish coalescing
Dua operator ES2020 ini sahabat terbaik saat datanya mungkin kosong.
?. berhenti dan menghasilkan undefined begitu menemukan null atau undefined. ?? hanya menganggap null dan undefined sebagai kosong, sedangkan || juga membuang 0, "", dan false. Untuk nilai default angka atau teks, ?? hampir selalu pilihan yang benar.
BigInt dan logical assignment
Number hanya presisi sampai Number.MAX_SAFE_INTEGER (9007199254740991). Lewat dari itu, angka mulai dibulatkan. BigInt (ES2020) ditulis dengan akhiran n dan presisinya tak terbatas.
Logical assignment (ES2021) menggabungkan operator logika dan =:
Bonus ES2021: replaceAll. "a-b-c".replace("-", "+") hanya mengganti yang pertama ('a+b-c'), sedangkan "a-b-c".replaceAll("-", "+") mengganti semuanya ('a+b+c').
Private field dan static block
Ingat konvensi _saldo di bab class? ES2022 memberi privasi sungguhan dengan #.
Array.at, Object.hasOwn, dan structuredClone
structuredClone bukan bagian dari ECMAScript, melainkan API web yang tersedia di browser modern dan Node.js 17 ke atas. Ia menyalin sampai ke dalam, berbeda dari spread { ...asli } yang hanya menyalin lapisan pertama. Fungsi dan instance class tidak bisa di-clone dengan cara ini.
Timeline ES2016 sampai ES2023
| Versi | Fitur utama |
|---|---|
| ES2016 | Array.prototype.includes, operator pangkat ** |
| ES2017 | async/await, Object.entries/values, padStart/padEnd |
| ES2018 | object spread/rest, Promise.prototype.finally, async iteration |
| ES2019 | flat/flatMap, Object.fromEntries, trimStart/trimEnd |
| ES2020 | ?., ??, BigInt, globalThis, Promise.allSettled, matchAll |
| ES2021 | logical assignment (??=, &&=, dan versi OR), replaceAll, Promise.any |
| ES2022 | private field #, static block, at(), Object.hasOwn, top-level await |
| ES2023 | findLast/findLastIndex, toSorted, toReversed, with |
Cheat sheet: kapan pakai apa
| Kebutuhan | Pakai |
|---|---|
Properti yang mungkin null | ?. |
Nilai default yang boleh 0 atau "" | ?? |
| Menunggu operasi asynchronous | async/await + try/catch |
| Beberapa request yang independen | await Promise.all([...]) |
| Mengubah isi objek per key | Object.entries lalu fromEntries |
| Elemen terakhir array | .at(-1) |
| Data rahasia di class | #field |
| Salinan dalam objek | structuredClone |
| Angka melebihi 2^53 | BigInt |
Kesalahan umum
- Lupa
await.const data = ambil()berisi Promise, bukan datanya, sehinggadata.judulbernilaiundefined. - Memakai
awaitdi luar fungsiasyncpada script biasa, hasilnyaSyntaxError. - Memakai
||untuk default angka. Stok0berubah menjadi nilai default; pakai??. - Mencampur BigInt dan Number dalam satu operasi tanpa konversi.
- Mengira spread menyalin dalam. Array di dalam objek masih dipakai bersama; pakai
structuredClone. - Menyalahgunakan
?.sampai menyembunyikan bug. Pakai hanya untuk data yang memang boleh kosong.
Rangkuman
- JavaScript rilis tiap tahun; Babel dan bundler membantu kode modern tetap jalan di browser lama.
async/awaitmembuat Promise terbaca lurus, error ditangkap dengantry/catch, dan tugas independen dijalankan paralel denganPromise.all.?.dan??menangani data kosong dengan aman;??=,||=,&&=meringkas penugasan bersyarat.- Fitur kecil seperti
Object.fromEntries,flat,replaceAll,at,Object.hasOwn,#field, danstructuredClonemenggantikan banyak kode bantu buatan sendiri.
Slide 39 sampai 57 dari deck JavaScript. Penjelasan lengkapnya ada di mode Baca.

Selesaikan bab ini
- 1. Baca materi
- 2. Latihan kode (1)
- 3. Kuis (4 soal)
Latihan kode: Profil aman dan dompet privat
Lengkapi:
async function muatProfil(ambil)memanggilawait ambil()yang mengembalikan objek user atau melempar error. Kembalikan{ nama, kota }dengannamadariuser.profil.nama(default"Tamu") dankotadariuser.alamat.kota(default"-"). Gunakan?.dan??. Bilaambilgagal, tangkap dengantry/catchdan kembalikan{ error: <pesan error> }.kodeInvoice(n)mengembalikan"INV-"diikutinyang dipanjangkan jadi 4 digit dengan nol di depan. Contoh:kodeInvoice(7)menghasilkan"INV-0007".- class
Dompetdengan private field#saldo(awal0), methodsetor(jumlah), dan gettersaldo.
Cek pemahaman
1Apa yang ditampilkan kode berikut?
const stok = 0; console.log(stok || 10, stok ?? 10);2Apa nilai `user.alamat?.kota` bila `user = { alamat: null }`?
3Apa yang ditampilkan kode berikut?
const ambil = async () => ({ nama: "Dini" }); async function nama() { const u = await ambil(); return u.nama; } nama().then((n) => console.log(n));4`structuredClone` adalah fitur ECMAScript ES2022 yang sama dengan spread `{ ...obj }`.