Tipe data

Tipe-tipe dasar JavaScript dan sifat pengetikan dinamisnya.

Daftar isi

Setiap nilai di JavaScript memiliki tipe yang menentukan operasi apa yang dapat dilakukan terhadapnya. Ada tujuh tipe primitif, yaitu number, string, boolean, undefined, null, symbol, dan bigint, ditambah satu tipe object yang menampung kumpulan properti. Topik ini memperkenalkan semuanya lewat operator typeof, menyoroti keanehan typeof null, dan menjelaskan sifat pengetikan dinamis JavaScript. Pembahasan tipe number mencakup bilangan desimal serta dua nilai istimewa, yaitu NaN dan Infinity.

Delapan tipe dan operator typeof#

typeof adalah operator yang mengembalikan nama tipe sebuah nilai dalam bentuk string. Operator ini adalah alat pertama untuk memeriksa apa yang sebenarnya disimpan sebuah variabel. Kode berikut memeriksa satu per satu nilai perwakilan dari setiap tipe.

js Contoh: satu nilai perwakilan untuk setiap tipe
console.log(typeof 42);            // number
console.log(typeof 3.14);          // number
console.log(typeof "teks");        // string
console.log(typeof true);          // boolean
console.log(typeof undefined);     // undefined
console.log(typeof null);          // object, keanehan yang dibahas di bawah
console.log(typeof Symbol("id"));  // symbol
console.log(typeof 10n);           // bigint
console.log(typeof { suku: 1 });   // object
console.log(typeof [1, 2, 3]);     // object, array juga object
text Keluaran
number
number
string
boolean
undefined
object
symbol
bigint
object
object

Dua baris terakhir perlu diperhatikan, karena object literal dan array sama-sama dilaporkan sebagai object. Array memang object dengan perilaku tambahan, dan untuk membedakannya dari object biasa digunakan Array.isArray(), yang pembahasannya menyusul pada modul object dan array. Sementara itu, symbol adalah tipe pengenal yang unik dan tidak akan bertabrakan dengan pengenal lain, sedangkan bigint menampung bilangan bulat yang melewati batas aman tipe number. Keduanya jarang ditemui di awal, sehingga mengenali namanya saja sudah cukup untuk saat ini.

number, bilangan desimal, dan dua nilai istimewa#

Tipe number mencakup bilangan bulat dan bilangan pecahan dalam satu tipe yang sama, tanpa pembedaan bilangan bulat dan desimal seperti pada banyak bahasa lain. Semuanya disimpan sebagai bilangan titik apung (floating point) berukuran 64 bit menurut standar IEEE 754. Representasi ini memadai untuk kebanyakan kebutuhan, tetapi membawa akibat yang sering mengejutkan pada aritmetika desimal.

js Contoh: pembulatan titik apung pada 0.1 + 0.2
console.log(0.1 + 0.2);
console.log(0.1 + 0.2 === 0.3);
console.log((0.1 + 0.2).toFixed(2));
text Keluaran
0.30000000000000004
false
0.30

Hasil 0.30000000000000004 bukan error, melainkan akibat pembulatan representasi titik apung, dan perilaku serupa ditemui di hampir semua bahasa yang memakai standar yang sama. Metode toFixed(2) membulatkan angka untuk keperluan tampilan. Untuk nilai uang yang sensitif terhadap pembulatan, perhitungan sebaiknya memakai satuan terkecil seperti sen agar berlangsung dalam bilangan bulat. Dua nilai istimewa melengkapi tipe ini, yaitu NaN dan Infinity, dan keduanya muncul dari operasi yang gagal atau melewati batas.

js Contoh: NaN dan Infinity
console.log(0 / 0);
console.log("apel" - 2);
console.log(Number.isNaN(0 / 0));
console.log(1 / 0);
console.log(-1 / 0);
text Keluaran
NaN
NaN
true
Infinity
-Infinity

NaN, singkatan dari not a number, muncul ketika operasi angka gagal dikerjakan, misalnya saat string dikurangi angka. Memeriksa NaN dengan === tidak pernah berhasil, karena NaN tidak sama dengan nilai apa pun, termasuk dirinya sendiri. Karena itu, fungsi Number.isNaN() adalah cara yang benar, dan keluaran di atas menunjukkan hasilnya true. Sementara itu, Infinity dan -Infinity muncul dari pembagian dengan nol pada bilangan titik apung, berbeda dengan banyak bahasa yang menghentikan program pada pembagian demikian. Ketiga nilai ini cukup dikenali sekarang, karena keluaran yang mengandung NaN hampir selalu menjadi tanda adanya konversi tipe yang tidak disengaja.

undefined dan null#

Dua tipe primitif tersisa sering tertukar karena sama-sama berarti ketiadaan nilai. undefined adalah nilai yang belum diberi apa-apa, baik karena variabelnya dideklarasikan tanpa inisialisasi maupun karena fungsi tidak mengembalikan apa pun. null adalah ketiadaan nilai yang sengaja ditulis, biasanya oleh programmer, untuk menandai bahwa sebuah variabel atau properti memang dikosongkan. Kode berikut menampilkan keduanya berdampingan.

js Contoh: undefined versus null
let alarm;
console.log(alarm);
const kunci = null;
console.log(kunci);
console.log(typeof alarm, typeof kunci);
text Keluaran
undefined
null
undefined object

Baris terakhir memperlihatkan masalah yang jarang diperhatikan, yaitu typeof alarm menghasilkan undefined sesuai aslinya, sedangkan typeof kunci menghasilkan object padahal null bukan object. Penyimpangan ini berasal dari keputusan implementasi pada versi JavaScript pertama, dan perilakunya dipertahankan sampai sekarang demi kompatibilitas dengan kode lama. Untuk memeriksa null, gunakan perbandingan langsung nilai === null dan bukan typeof. Alasan praktisnya dirangkum pada peringatan berikut.

Pengetikan dinamis#

JavaScript bersifat dinamis dalam pengetikan, artinya tipe menempel pada nilai, bukan pada variabelnya. Satu variabel yang sama boleh menampung string, lalu number, lalu boolean, tanpa pernyataan tipe apa pun di depannya. Operator typeof yang dipanggil ulang setelah setiap perubahan memperlihatkan perpindahan tipe tersebut.

js Contoh: satu variabel berpindah tipe
let kotak = "buku";
console.log(typeof kotak);
kotak = 7;
console.log(typeof kotak);
kotak = false;
console.log(typeof kotak);
text Keluaran
string
number
boolean

Kebebasan ini mempercepat penulisan program kecil, tetapi menuntut kewaspadaan saat program membesar, karena tipe sebuah variabel hanya diketahui dengan membaca alurnya. Akibat yang paling sering muncul adalah nilai yang berpindah tipe tanpa disadari, lalu operasi berikutnya berperilaku berbeda dari perkiraan. Konversi tipe yang dilakukan JavaScript secara otomatis beserta kejutan klasiknya dibahas pada topik Koersi tipe. Sebelum sampai ke sana, daftar tipe di atas sudah cukup sebagai peta yang menuntun pembacaan kode sehari-hari.

Ringkasan#

  • Tujuh tipe primitif, yaitu number, string, boolean, undefined, null, symbol, dan bigint, ditambah object mencakup seluruh nilai JavaScript.
  • typeof melaporkan nama tipe sebuah nilai, dengan keanehan bersejarah pada null yang dilaporkan sebagai object.
  • Tipe number memakai representasi titik apung 64 bit sehingga 0.1 + 0.2 tidak persis 0.3, dan mengenal NaN serta Infinity sebagai nilai istimewa.
  • Pengetikan dinamis menempelkan tipe pada nilai, bukan pada variabel, sehingga satu variabel boleh berpindah tipe.

Referensi#