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.
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
number
number
string
boolean
undefined
object
symbol
bigint
object
objectDua 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.
console.log(0.1 + 0.2);
console.log(0.1 + 0.2 === 0.3);
console.log((0.1 + 0.2).toFixed(2));0.30000000000000004
false
0.30Hasil 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.
console.log(0 / 0);
console.log("apel" - 2);
console.log(Number.isNaN(0 / 0));
console.log(1 / 0);
console.log(-1 / 0);NaN
NaN
true
Infinity
-InfinityNaN, 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.
let alarm;
console.log(alarm);
const kunci = null;
console.log(kunci);
console.log(typeof alarm, typeof kunci);undefined
null
undefined objectBaris 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.
let kotak = "buku";
console.log(typeof kotak);
kotak = 7;
console.log(typeof kotak);
kotak = false;
console.log(typeof kotak);string
number
booleanKebebasan 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, danbigint, ditambahobjectmencakup seluruh nilai JavaScript. typeofmelaporkan nama tipe sebuah nilai, dengan keanehan bersejarah padanullyang dilaporkan sebagaiobject.- Tipe
numbermemakai representasi titik apung 64 bit sehingga0.1 + 0.2tidak persis0.3, dan mengenalNaNsertaInfinitysebagai nilai istimewa. - Pengetikan dinamis menempelkan tipe pada nilai, bukan pada variabel, sehingga satu variabel boleh berpindah tipe.
Referensi#
- JavaScript — MDN Web Docs
— Dokumentasi struktur data dan tipe nilai JavaScript, termasuk perilaku
typeof. - The Modern JavaScript Tutorial — javascript.info — Bab tipe data yang memperkenalkan number, string, dan tipe primitif lainnya.