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:

js
console.log(typeof "Kopi Gayo"); // "string"
console.log(typeof 18000);       // "number"

Output yang Dihasilkan:

text
string
number

typeof 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:

EkspresiHasil typeofCatatan
typeof "Kopi Gayo"stringteks apa pun, termasuk string kosong
typeof 18000numberbulat dan desimal sama-sama number
typeof 9007199254740993nbigintselalu dengan akhiran n
typeof truebooleantrue maupun false
typeof undefinedundefinedsatu-satunya tipe berkeluaran dirinya sendiri
typeof Symbol("id")symboldescription tidak memengaruhi hasil
typeof nullobjectjebakan historis — bukan tipe sebenarnya
typeof {}objectobject sungguhan (dibahas di section Objects)
typeof console.logfunctionfunction satu-satunya yang punya keluaran khusus
typeof NaNnumberNaN 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:

js
const inputPengguna = null;
console.log(typeof inputPengguna);   // "object" — tidak membantu
console.log(inputPengguna === null); // true — cara yang benar

Output yang Dihasilkan:

text
object
true

Jebakan 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":

js
console.log(typeof console.log); // "function"

Output yang Dihasilkan:

text
function

console.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:

text
string
number
bigint
boolean
undefined
symbol
object
object
function
number
undefined
string

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. 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.
  2. Baris 10 (console.log(typeof null);): keluaran object, bukan "null" — satu-satunya primitive yang keluaran typeof-nya tidak mencerminkan tipenya.
  3. Baris 11 (console.log(typeof {});): pasangan kurung kurawal membuat object kosong, dan typeof membedakannya dengan benar sebagai object. Sayangnya keluaran ini identik dengan baris null — itulah mengapa deteksi null memakai === null.
  4. Baris 12–13 (console.log(typeof console.log); dst.): function menghasilkan "function", sedangkan NaN menghasilkan "number" karena memang nilai tipe number.
  5. Baris 16 (console.log(typeof namaHantu);): namaHantu tidak pernah dideklarasikan, tetapi typeof tetap menjawab "undefined" tanpa memunculkan ReferenceError.
  6. Baris 17 (console.log(typeof typeof 18000);): typeof dalam dijalankan dulu dan menghasilkan string "number", lalu typeof luar 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
javascript
// 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