Saat mengamati keluaran program yang sedang diperiksa, Budi melihat teks 25 dan angka 25 bergantian muncul di console — dan keduanya tercetak sama persis tanpa tanda kutip. Pertanyaan pertama yang wajar: nilai ini sebenarnya bertipe apa? Menebak dari tampilan bukan jawaban yang andal, apalagi sebagian keluaran tidak menunjukkan tipenya dengan jelas. JavaScript menyediakan alat resmi untuk pertanyaan itu: operator typeof.
Chapter ini melatih pemakaian typeof pada semua tipe yang sudah kita kenal, lalu membongkar dua keunikan yang membuat pemula sering tergelincir: keluaran untuk null dan keluaran untuk NaN. Semua keluaran di bawah diuji nyata di Node.
Operator typeof #
Operator typeof menerima satu nilai atau ekspresi dan mengembalikan string yang menyebutkan tipenya. Karena hasilnya string, hasil itu bisa dibandingkan, disimpan dalam variabel, dan dicetak:
console.log(typeof "Kopi Gayo"); // "string"
console.log(typeof 18000); // "number"
Output yang Dihasilkan:
string
numbertypeof boleh ditulis dengan tanda kurung — typeof x dan typeof(x) menghasilkan keluaran yang sama — karena tanda kurung di sini bukan sintaks pemanggilan, melainkan sekadar pengelompokan ekspresi. Kita pakai bentuk tanpa kurung sebagai gaya bawaan sepanjang course ini.
Karena hasil typeof selalu bertipe string, typeof bisa dipanggil bertingkat: typeof typeof 18000 menghasilkan "string", yaitu tipe dari hasil typeof yang pertama.
Hasil untuk Setiap Tipe #
Tabel berikut merangkum keluaran typeof untuk setiap nilai yang telah kita kenal:
| Ekspresi | Hasil typeof | Catatan |
|---|---|---|
typeof "Kopi Gayo" | string | teks apa pun, termasuk string kosong |
typeof 18000 | number | bulat dan desimal sama-sama number |
typeof 9007199254740993n | bigint | selalu dengan akhiran n |
typeof true | boolean | true maupun false |
typeof undefined | undefined | satu-satunya tipe berkeluaran dirinya sendiri |
typeof Symbol("id") | symbol | description tidak memengaruhi hasil |
typeof null | object | jebakan historis — bukan tipe sebenarnya |
typeof {} | object | object sungguhan (dibahas di section Objects) |
typeof console.log | function | function satu-satunya yang punya keluaran khusus |
typeof NaN | number | NaN memang bagian dari tipe number |
Tiga baris terakhir layak dicermati terpisah karena masing-masing menyimpan kejutan — dua di antaranya kita bedah di bawah.
Jebakan 1: typeof null #
typeof null menghasilkan "object", padahal null adalah primitive dan bukan object. Ini berasal dari implementasi bahasa yang pertama: engine memberi tag tipe pada setiap nilai, dan null memakai tag yang sama dengan object. Kesalahan itu terlanjur tercetak pada perilaku bahasa, dan memperbaikinya berisiko merusak jutaan program yang sudah berjalan — sehingga keluaran "object" dipertahankan sampai hari ini demi kompatibilitas.
Konsekuensinya, typeof tidak bisa dipakai untuk mendeteksi null. Cara yang benar adalah perbandingan langsung:
const inputPengguna = null;
console.log(typeof inputPengguna); // "object" — tidak membantu
console.log(inputPengguna === null); // true — cara yang benar
Output yang Dihasilkan:
object
trueJebakan 2: function dan NaN #
Dua keluaran lain sering dianggap kejutan, meski keduanya justru konsisten dengan aturan bahasanya. Pertama, function mendapat keluaran khusus — satu-satunya tipe non-primitive yang typeof-nya tidak jatuh ke "object":
console.log(typeof console.log); // "function"
Output yang Dihasilkan:
functionconsole.log adalah sebuah function bawaan, dan typeof mengenalinya sebagai "function". Kita belum membuat function sendiri — itu tugas section Functions — tetapi mulai sekarang kita tahu mengapa kode orang lain menyebut typeof ketika memilah function dari nilai lain.
Kedua, typeof NaN menghasilkan "number". Nama Not a Number membuatnya terdengar bukan angka, tetapi NaN secara resmi adalah nilai tipe number — hasil perhitungan angka yang gagal tetap dikategorikan angka. Karena itu pemeriksaan yang andal bukan typeof, melainkan Number.isNaN() yang sudah kita latih di chapter Numbers.
Satu kemampuan lain yang berguna saat debugging: typeof tetap aman dipanggil pada nama yang belum dideklarasikan. Membaca variabel yang tidak pernah dideklarasikan menghentikan program dengan ReferenceError — seperti yang kita buktikan di section Dasar Pemrograman — tetapi typeof namaTidakAda tidak; typeof mengembalikan "undefined" dengan tenang. Inilah alasan typeof menjadi alat pemeriksaan pertama yang aman pada kode yang belum sepenuhnya kita pahami.
Contoh Lengkap: Pemeriksa Tipe #
Berkas berikut menjalankan seluruh tabel di atas dalam satu urutan uji:
// pemeriksa-tipe.js
// Keluaran operator typeof untuk berbagai nilai JavaScript.
console.log(typeof "Kopi Gayo"); // string
console.log(typeof 18000); // number
console.log(typeof 9007199254740993n); // bigint
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
console.log(typeof Symbol("id")); // symbol
console.log(typeof null); // object — jebakan historis
console.log(typeof {}); // object — object sungguhan
console.log(typeof console.log); // function
console.log(typeof NaN); // number — NaN tetap tipe number
// typeof tetap aman dipakai pada nama yang belum dideklarasikan
console.log(typeof namaHantu); // undefined
console.log(typeof typeof 18000); // string — hasil typeof selalu string
Output yang Dihasilkan:
string
number
bigint
boolean
undefined
symbol
object
object
function
number
undefined
stringMari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 4–9 (
console.log(typeof "Kopi Gayo");dst.): enam tipe primitive pertama menghasilkan keluaran yang rapi dan sesuai namanya —string,number,bigint,boolean,undefined,symbol. - Baris 10 (
console.log(typeof null);): keluaranobject, bukan"null"— satu-satunya primitive yang keluarantypeof-nya tidak mencerminkan tipenya. - Baris 11 (
console.log(typeof {});): pasangan kurung kurawal membuat object kosong, dantypeofmembedakannya dengan benar sebagaiobject. Sayangnya keluaran ini identik dengan barisnull— itulah mengapa deteksinullmemakai=== null. - Baris 12–13 (
console.log(typeof console.log);dst.): function menghasilkan"function", sedangkanNaNmenghasilkan"number"karena memang nilai tipenumber. - Baris 16 (
console.log(typeof namaHantu);):namaHantutidak pernah dideklarasikan, tetapitypeoftetap menjawab"undefined"tanpa memunculkanReferenceError. - Baris 17 (
console.log(typeof typeof 18000);):typeofdalam dijalankan dulu dan menghasilkan string"number", lalutypeofluar memeriksa string itu — hasil akhirnya"string".
Dengan typeof, kita kini bisa menanyakan tipe nilai mana pun dengan satu operator. Section ini menyisakan satu kemampuan penting yang sudah beberapa kali kita singgung: mengubah nilai dari satu tipe ke tipe lain — secara sengaja maupun oleh engine. Topik itu menjadi tumpuan chapter berikutnya, Type Conversion.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
pemeriksa-tipe.js
Unduh berkas// pemeriksa-tipe.js
// Keluaran operator typeof untuk berbagai nilai JavaScript.
console.log(typeof "Kopi Gayo"); // string
console.log(typeof 18000); // number
console.log(typeof 9007199254740993n); // bigint
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
console.log(typeof Symbol("id")); // symbol
console.log(typeof null); // object — jebakan historis
console.log(typeof {}); // object — object sungguhan
console.log(typeof console.log); // function
console.log(typeof NaN); // number — NaN tetap tipe number
// typeof tetap aman dipakai pada nama yang belum dideklarasikan
console.log(typeof namaHantu); // undefined
console.log(typeof typeof 18000); // string — hasil typeof selalu string