Menu

Tipe Primitif JavaScript: Tujuh Jenis Nilai Bawaan

Tujuh tipe primitif di JavaScript, yaitu string, number, bigint, boolean, null, undefined, dan symbol, serta bedanya dengan object.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Tujuh primitif dan sisanya

JavaScript membagi nilai ke dalam dua kubu. Di satu sisi, tujuh tipe primitif: nilai yang sederhana dan tidak bisa diubah. Di sisi lain, object: semua yang tersusun dari bagian lain, bisa diubah, atau bisa dipanggil. Itulah seluruh sistem tipe di tingkat nilai.

Ketujuh primitif itu:

Apa pun yang tidak ada di daftar itu, seperti array, fungsi, tanggal, regex, dan {} biasa, adalah object. typeof memberimu tipe saat runtime, dan kamu pasti melihat cacat terkenal di baris terakhir. typeof null sudah mengembalikan 'object' sejak 1995 dan tidak akan pernah diperbaiki; terlalu banyak kode yang sudah bergantung padanya.

Primitif adalah nilai, bukan wadah

Cara berpikir yang paling membantu: primitif adalah nilainya sendiri. Angka 3 bukan kotak yang berisi 3; ia hanya 3. Dua variabel yang menyimpan 3 menyimpan nilai yang sama, bukan dua salinan yang menunjuk ke sesuatu yang dipakai bersama:

Primitif dibandingkan berdasarkan nilai. Object dibandingkan berdasarkan referensi. Perbedaan yang satu ini ada di balik banyak momen "kenapa ini false?" nantinya, terutama saat membandingkan array atau object dengan ===.

Primitif tidak bisa diubah

Kamu tidak bisa memodifikasi primitif. Setiap operasi yang terlihat seperti mengubah sebenarnya menghasilkan nilai baru:

Pemanggilan pertama membuat string baru lalu membuangnya karena tidak ada yang menangkap nilai kembaliannya. Yang kedua melakukan assignment ulang pada name. "ada" yang asli tidak pernah diubah, dan memang tidak bisa. Sama halnya dengan angka: x + 1 menghasilkan angka baru, bukan mengubah x.

Itulah kenapa const pada string atau angka benar-benar aman. Nilainya tidak bisa berubah, dan const mencegahmu melakukan assignment ulang pada variabelnya.

Number, BigInt, dan kenapa ada dua

number di JavaScript adalah float 64-bit. Artinya aritmetikanya cepat, tapi ada batas atas: bilangan bulat hanya tepat sampai Number.MAX_SAFE_INTEGER (2^53 - 1):

Melewati ambang itu, bilangan bulat mulai bertabrakan. bigint ada untuk bilangan bulat yang harus tetap tepat berapa pun besarnya. Kamu menulisnya dengan akhiran n:

bigint dan number tidak bisa dicampur dalam aritmetika, karena itu akan menghilangkan seluruh manfaat presisi tambahannya. Pakai bigint saat kamu berurusan dengan ID database, timestamp dalam nanodetik, atau kriptografi. Aritmetika biasa tetap memakai number.

String juga primitif

String di JavaScript adalah primitif, bukan object, walaupun ia menyediakan method seperti .length, .slice, .toUpperCase:

Di balik layar, saat kamu memanggil method pada string, JavaScript sebentar membungkusnya dalam object String supaya pemanggilan method berjalan, lalu membuang pembungkus itu. Kamu tidak perlu memikirkan pembungkus itu; cukup tahu bahwa string berperilaku seperti nilai (tidak bisa diubah, dibandingkan berdasarkan nilai) walaupun punya banyak method.

Tanda kutip tunggal, tanda kutip ganda, dan backtick semuanya membuat tipe yang sama. Backtick juga mendukung interpolasi dan string multi-baris, yang dibahas di dokumen berikutnya.

null vs undefined

Dua primitif berarti "tidak ada nilai", dan keduanya tidak bisa saling menggantikan.

undefined adalah yang kamu dapat saat sesuatu tidak pernah diberi nilai: variabel yang dideklarasikan tapi belum diisi, argumen fungsi yang tidak dikirim, property yang tidak ada:

null adalah yang kamu tulis saat ingin mengatakan "sengaja dikosongkan":

Kesepakatan kasarnya: undefined adalah cara bahasa mengatakan "tidak ada apa-apa di sini", null adalah cara programmer mengatakannya. Keduanya falsy, keduanya tidak sama dengan nilai biasa, dan keduanya punya halaman khusus nanti.

Symbol: unik sejak dibuat

symbol adalah primitif yang paling jarang dipakai. Setiap symbol yang kamu buat bersifat unik, bahkan kalau dua symbol dibuat dari deskripsi yang sama:

Symbol berguna sebagai key object yang tidak bisa bertabrakan dengan key yang sudah ada: sebuah library bisa menempelkan metadata ke object-mu memakai symbol dan yakin tidak ada kode lain yang akan menimpanya. Kamu akan bertemu symbol lagi saat membahas iterator dan well-known symbol seperti Symbol.iterator.

Mengecek tipe saat runtime

typeof menangani sebagian besar kasus. Ingat keanehan-keanehan ini:

Untuk null, bandingkan langsung: value === null. Untuk array, pakai Array.isArray(value). Untuk "apakah ini primitif apa saja?" tidak ada satu fungsi bawaan, tapi idiomnya cukup jelas:

Primitif vs object: jebakan assignment

Satu hal lagi yang perlu kamu lihat sebelum lanjut. Karena primitif adalah nilai dan object adalah referensi, assignment berperilaku berbeda:

Pada primitif, b = a menyalin nilainya. Pada object, y = x menyalin referensinya: kedua nama menunjuk ke object yang sama. Mengubah lewat satu nama memengaruhi nama lainnya. Inilah sumber terbesar bug "lho, kenapa itu berubah?" di JavaScript.

Yang perlu kamu ingat

  • Tujuh primitif: string, number, bigint, boolean, null, undefined, symbol. Selebihnya adalah object.
  • Primitif tidak bisa diubah dan dibandingkan berdasarkan nilai; object bisa diubah dan dibandingkan berdasarkan referensi.
  • typeof memberitahumu tipe saat runtime, dengan dua keanehan yang perlu dihafal: typeof null === "object" dan typeof function === "function".
  • number adalah float 64-bit dengan batas aman untuk bilangan bulat; bigint ada untuk bilangan bulat yang tepat melewati batas itu.

Berikutnya: string dan template literal

String adalah primitif yang paling sering kamu sentuh, dan template literal (string dengan backtick itu) membuat penyusunannya mudah: interpolasi, teks multi-baris, tagged template. Itulah halaman berikutnya.

Pertanyaan yang sering diajukan

Ada berapa tipe primitif di JavaScript?

Tujuh: string, number, bigint, boolean, null, undefined, dan symbol. Selebihnya, seperti array, fungsi, tanggal, dan object biasa, adalah object. Kamu bisa mengecek tipe sebuah nilai saat runtime dengan typeof, dengan satu keanehan bersejarah: typeof null mengembalikan 'object'.

Apa bedanya primitif dan object di JavaScript?

Primitif adalah nilai yang tidak bisa diubah dan dibandingkan berdasarkan nilainya: dua 3 adalah 3 yang sama. Object bisa diubah dan dibandingkan berdasarkan referensi: dua {} tetap berbeda walaupun terlihat identik. Melakukan assignment pada primitif menyalin nilainya; melakukan assignment pada object menyalin referensi ke data yang sama.

Apakah primitif di JavaScript benar-benar immutable?

Ya. Kamu tidak bisa mengubah primitif di tempat: 'hello'.toUpperCase() mengembalikan string baru, bukan mengubah yang asli. Assignment ulang sebuah variabel (x = x + 1) menukar nilai variabel itu dengan primitif lain; nilai aslinya tidak pernah diubah. Karena itulah const name = 'Ada' tetap membolehkanmu membuat string baru dari name.

Kenapa typeof null mengembalikan 'object'?

Itu bug di implementasi asli tahun 1995 yang tidak pernah diperbaiki karena terlalu banyak kode yang bergantung pada perilaku itu. Untuk mengecek null, bandingkan dengan ===: value === null. Untuk mengecek undefined, pakai value === undefined atau typeof value === 'undefined'.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai