Dua Cara Mengatakan "Tidak Ada"
Kebanyakan bahasa punya satu nilai untuk menyatakan ketiadaan. JavaScript punya dua: null dan undefined. Keduanya cukup mirip untuk membingungkan pemula, dan cukup berbeda untuk menjebak developer berpengalaman. Memahami pembagian ini layak kamu luangkan sepuluh menit.
Versi singkatnya:
undefinedadalah yang diberikan JavaScript saat sesuatu tidak ada.nulladalah yang kamu tulis saat ingin mengatakan "sengaja dikosongkan."
Perhatikan polanya: setiap undefined di atas terjadi karena JavaScript tidak bisa menemukan nilainya. null terjadi karena seseorang mengetiknya.
Dari Mana undefined Berasal
undefined muncul di beberapa situasi tertentu, semuanya variasi dari "tidak ada nilai yang tersedia":
Dalam setiap kasus, JavaScript mencari sebuah nilai dan tidak menemukan apa-apa. undefined adalah cara engine mengatakan "aku sudah mencari, tidak ada nilainya."
Kamu bisa mengisi undefined sendiri (let x = undefined;), tetapi sebaiknya jangan. Biarkan ia tetap menjadi tanda bahwa "JavaScript tidak menemukan apa pun." Pakai null saat kamulah yang membuat keputusan.
Dari Mana null Berasal
null hanya muncul saat seseorang menuliskannya. Itulah intinya: ia adalah penanda yang disengaja.
API DOM sering memakai null: document.getElementById("missing") mengembalikan null, bukan undefined, karena browser secara eksplisit memberitahumu "aku sudah mencari, dan jawabannya tidak ada elemen." JSON.parse("null") juga memberimu null, karena JSON tidak punya undefined.
Model mentalnya: undefined adalah ketiadaan default, null adalah ketiadaan yang dipilih.
Keanehan typeof
Inilah yang terkenal itu:
typeof null yang mengembalikan "object" adalah bug dari tahun 1995 yang tidak bisa diperbaiki tanpa merusak website yang sudah ada, jadi dipertahankan selamanya. null bukan objek, melainkan tipe primitif, sama seperti undefined, angka, string, dan boolean. Hasil typeof hanya berbohong soal itu.
Akibat praktisnya: typeof tidak berguna untuk mendeteksi null. Pakai perbandingan langsung:
Atau, yang lebih sering, cek keduanya sekaligus, seperti di bagian berikutnya.
Mengecek Keduanya: Idiom == null
Sebagian besar waktu kamu tidak peduli nilai ketiadaan yang mana yang kamu punya; kamu hanya ingin tahu apakah ada yang hilang sebelum memakainya. Pengecekan yang lazim adalah kesamaan longgar dengan null:
value == null bernilai true hanya untuk null dan undefined, dan false untuk semua yang lain, termasuk 0, "", dan false, yang biasanya memang yang kamu inginkan. Inilah satu-satunya situasi di mana == lebih disukai daripada ===. Linter mengetahuinya dan mengizinkannya.
Kalau kamu ingin eksplisit, value === null || value === undefined artinya sama dan terbaca dengan jelas.
Operator Nullish: ?? dan ?.
Dua operator ditambahkan khusus untuk memudahkan bekerja dengan null dan undefined. Keduanya memperlakukan kedua nilai itu sama persis dan membiarkan semua nilai lain.
Nullish coalescing (??) memberikan nilai cadangan hanya saat sisi kirinya null atau undefined:
Bandingkan dengan ||, yang akan mengganti 0 dengan 3 karena 0 bernilai falsy. ?? lebih ketat: ia hanya aktif untuk kedua nilai nullish.
Optional chaining (?.) menghentikan evaluasi rangkaian dan mengembalikan undefined saat bertemu null atau undefined:
Kedua operator ini ada karena "apakah nilai ini nullish?" adalah pertanyaan yang sangat umum. Keduanya dibahas lebih dalam di bagian kurikulum berikutnya.
Parameter Default Hanya Aktif untuk undefined
Satu aturan yang halus tetapi penting: nilai parameter default hanya berlaku untuk undefined, bukan untuk null.
Memberikan null dianggap sebagai "aku sengaja memilih tidak ada nilai" dan dihormati apa adanya. Kalau kamu ingin null juga memicu nilai cadangan, pakai ?? di dalam fungsinya:
Perbedaan ini sering menjebak orang. Default menangani argumen yang tidak ada; ?? menangani argumen yang nullish.
JSON dan undefined yang Hilang
JSON punya null tetapi tidak punya undefined. Ini menimbulkan kejutan diam-diam saat kamu melakukan serialisasi:
Field age hilang sepenuhnya: JSON.stringify membuang property yang nilainya undefined. null selamat karena JSON mendukungnya. Membawa sebuah objek bolak-balik lewat JSON adalah cara umum property undefined lenyap diam-diam.
Di dalam array, undefined menjadi null:
Kalau kamu merancang payload API, utamakan null daripada undefined untuk field "tidak ada nilai". Nilai itu selamat dalam perjalanan.
Kapan Memakai yang Mana
Konvensi yang masuk akal untuk kodemu sendiri:
- Biarkan
undefinedberarti "tidak diberikan": argumen yang tidak ada, variabel yang belum diisi, property yang tidak ada. Jangan mengisiundefinedsecara manual. - Pakai
nullsaat kamu ingin menyampaikan secara eksplisit bahwa "ini sengaja dikosongkan", misalnya pengguna yang sudah keluar, pilihan yang belum dipilih, atau field formulir yang dikosongkan. - Terima keduanya di batas API (pakai
== nullatau??), tetapi konsistenlah soal mana yang kamu hasilkan.
Beberapa panduan gaya (termasuk milik TypeScript) sama sekali melewatkan null dan hanya memakai undefined. Itu bisa dipertanggungjawabkan, karena satu nilai lebih sederhana daripada dua. Pilih satu aturan per proyek dan terapkan di mana-mana.
Berikutnya: Type Coercion
null dan undefined berperilaku dengan cara tertentu saat JavaScript mengubahnya menjadi angka, string, atau boolean: Number(null) bernilai 0, tetapi Number(undefined) bernilai NaN, dan ketidaksimetrisan seperti itu menyebabkan bug sungguhan. Type coercion adalah topik berikutnya, dan begitu kamu melihat aturan lengkapnya, banyak keanehan JavaScript tidak lagi terasa misterius.
Pertanyaan yang sering diajukan
Apa bedanya null dan undefined di JavaScript?
undefined berarti sebuah nilai belum diisi: itulah yang diberikan JavaScript untuk variabel, argumen, atau property objek yang tidak ada. null adalah tanda eksplisit 'tidak ada nilai di sini' yang kamu isi dengan sengaja. JavaScript tidak pernah menghasilkan null sendiri; kamu harus mengetiknya.
Bagaimana cara mengecek null dan undefined sekaligus?
Pakai value == null. Kesamaan longgar menganggap null dan undefined sama satu sama lain tetapi tidak sama dengan apa pun selain itu, jadi x == null bernilai true hanya untuk kedua nilai itu. Inilah satu-satunya tempat memakai == alih-alih === itu lazim dan aman.
Mengapa typeof null menghasilkan 'object'?
Ini bug dari versi pertama JavaScript yang tidak bisa diperbaiki tanpa merusak web. typeof null mengembalikan 'object' walaupun null adalah tipe primitif. Untuk mengecek null secara khusus, bandingkan langsung: value === null.
Sebaiknya aku memakai null atau undefined di kodeku sendiri?
Biarkan undefined berarti 'tidak ada yang diberikan' dan pakai null saat kamu ingin menandakan secara eksplisit 'ini sengaja dikosongkan.' Banyak codebase (dan panduan gaya TypeScript) sama sekali menghindari null dan hanya memakai undefined. Pilih satu konvensi per proyek lalu patuhi.