mahirsymbolbiginttipe-dataMahir3 mnt baca

Symbol & BigInt: Tipe Data yang Jarang Dibahas

Symbol memberi identitas unik untuk key object, BigInt menangani bilangan bulat raksasa tanpa kehilangan presisi.

Kenapa Dua Tipe Ini Ada?

Symbol lahir dari masalah tabrakan nama. Bayangkan dua library berbeda sama-sama menempelkan properti id ke object yang sama: yang satu menimpa yang lain tanpa peringatan. Symbol menyelesaikan ini dengan memberi setiap key sebuah identitas yang dijamin unik, tidak peduli deskripsinya sama.

BigInt lahir dari keterbatasan Number. Tipe number di JavaScript adalah floating point 64-bit, jadi bilangan bulat hanya akurat sampai Number.MAX_SAFE_INTEGER (9007199254740991). Lewat dari itu, 9007199254740993 === 9007199254740992 bernilai true, kacau untuk uang, ID database, atau kriptografi.

Contoh 1: Symbol sebagai Key Anti-Tabrakan

javascript
const idKasir = Symbol("id");
const idGudang = Symbol("id"); // deskripsi sama, tapi beda identitas!

const barang = {
  nama: "Kopi Tubruk",
  [idKasir]: "KSR-001",
  [idGudang]: "GDG-077",
};

console.log(idKasir === idGudang); // false, selalu unik
console.log(barang[idKasir]);     // "KSR-001"

// Symbol tidak muncul di loop biasa, aman dari kode orang lain
console.log(Object.keys(barang)); // ["nama"]

Pola ini dipakai library besar untuk menyimpan metadata internal di object milik user tanpa takut menimpa properti user.

Contoh 2: BigInt untuk Angka Raksasa

javascript
// Cara 1: akhiran n. Cara 2: BigInt("...")
const idTransaksi = 9007199254740993123456789n;
const saldo = BigInt("150000000000000000000");

const total = idTransaksi + 10n; // operasi sesama BigInt OK
console.log(total);
console.log(typeof total); // "bigint"

// Konversi eksplisit kalau perlu number (berisiko kehilangan presisi!)
console.log(Number(10n)); // 10

Kasus nyata: ID transaksi payment gateway, saldo dalam satuan terkecil (sen/satoshi), atau perhitungan kombinatorik yang angkanya meledak.

Catatan Teknis dan Jebakan

1. BigInt tidak boleh dicampur dengan Number.

javascript
// SALAH: TypeError
// const x = 10n + 5;

// BENAR: samakan dulu tipenya
const x = 10n + BigInt(5); // 15n
const y = Number(10n) + 5; // 15 (number)

2. JSON.stringify meledak saat bertemu BigInt.

javascript
// SALAH: TypeError: Do not know how to serialize a BigInt
// JSON.stringify({ saldo: 100n });

// BENAR: ubah ke string dulu
JSON.stringify({ saldo: String(100n) }); // '{"saldo":"100"}'

3. Symbol tidak bisa dikonversi otomatis ke string.

javascript
const s = Symbol("kunci");
// console.log("ID: " + s); // SALAH: TypeError
console.log("ID: " + s.toString()); // BENAR, eksplisit
console.log(s.description);         // "kunci", cara aman baca deskripsi

4. Symbol.for() vs Symbol(): Symbol("x") selalu bikin baru, sedangkan Symbol.for("x") memakai registry global sehingga kode di file berbeda bisa berbagi symbol yang sama. Pakai yang biasa kecuali kamu memang butuh berbagi antar modul.

Ringkasan

Pakai Symbol ketika kamu butuh key object yang dijamin tidak bertabrakan dengan siapa pun. Pakai BigInt ketika bilangan bulatmu bisa melewati 9 kuadriliun dan presisi adalah segalanya. Keduanya jarang dipakai sehari-hari, tapi saat dibutuhkan, tidak ada penggantinya.

Live Playground
export default function App(): JSX.Element {
  return <h1>Hello world</h1>
}

Edit kode di kiri, preview kanan ter-update otomatis.

Tantangan

Faktorial Raksasa yang Tepat

Di dunia nyata, perhitungan kombinatorik (peluang, lotre, statistik) butuh bilangan bulat yang tepat, bukan perkiraan. Tipe Number mulai kehilangan presisi di faktorial 19 ke atas, padahal jawabannya harus eksak. Tulis fungsi faktorial(n) memakai BigInt yang mengembalikan n! secara tepat, lalu tampilkan 30! di console. Bandingkan dengan versi Number untuk melihat selisihnya.

<!doctype html>
<html>
<head>
<meta charset="utf-8" />

</head>
<body>
<h1>Halo JS</h1>
<p>Buka console preview untuk melihat output.</p>
<script src="index.js"></script>
</body>
</html>