Tipe Data Lanjutan di JavaScript: Symbol dan BigInt

JavaScript adalah bahasa pemrograman yang terus berevolusi mengikuti kebutuhan pengembang modern. Selain tipe data dasar seperti Number, String, Boolean, Null, dan Undefined, kini JavaScript memiliki tipe data lanjutan yang jarang dibahas, yaitu Symbol dan BigInt. Kehadiran dua tipe data ini bukan sekadar tambahan, melainkan solusi atas keterbatasan yang ada sebelumnya. Artikel ini akan membahas keduanya secara lebih mendalam.


1. Symbol

Apa itu Symbol?

Symbol adalah tipe data primitif yang diperkenalkan pada ECMAScript 2015 (ES6). Setiap nilai Symbol bersifat unik dan tidak dapat digandakan, meskipun dibuat dengan deskripsi yang sama. Hal ini membuatnya ideal untuk digunakan sebagai identitas unik.

const s1 = Symbol("id");
const s2 = Symbol("id");

console.log(s1 === s2); // false

Pada contoh di atas, walaupun kedua Symbol memiliki deskripsi "id", hasil perbandingan menunjukkan bahwa keduanya berbeda. Inilah kekuatan utama Symbol: identitas yang unik.


Symbol sebagai Kunci Properti

Salah satu kegunaan utama Symbol adalah sebagai kunci properti pada objek. Berbeda dengan string, kunci berbasis Symbol tidak akan muncul dalam perulangan for...in atau Object.keys(), sehingga lebih “privat”.

const ID = Symbol("internalId");

const user = {
  name: "Rina",
  [ID]: 12345
};

console.log(user.name); // "Rina"
console.log(user[ID]);  // 12345
console.log(Object.keys(user)); // ["name"]

Properti dengan kunci Symbol hanya bisa diakses jika kita memiliki referensi Symbol tersebut.


Well-known Symbols

JavaScript memiliki beberapa Symbol bawaan, yang disebut well-known symbols, untuk mendefinisikan perilaku khusus. Misalnya:

  • Symbol.iterator: membuat objek dapat diiterasi dengan for...of.
  • Symbol.toStringTag: mengubah hasil Object.prototype.toString.
  • Symbol.hasInstance: menentukan hasil dari operator instanceof.

Contoh implementasi Symbol.iterator:

const range = {
  start: 1,
  end: 3,
  [Symbol.iterator]() {
    let current = this.start;
    const end = this.end;
    return {
      next() {
        if (current <= end) {
          return { value: current++, done: false };
        }
        return { done: true };
      }
    };
  }
};

for (const n of range) {
  console.log(n); // 1, 2, 3
}

Dengan Symbol.iterator, objek range dapat digunakan dalam perulangan for...of layaknya array.


2. BigInt

Apa itu BigInt?

BigInt adalah tipe data primitif yang diperkenalkan pada ECMAScript 2020. Tipe ini memungkinkan JavaScript untuk merepresentasikan bilangan bulat dengan ukuran sangat besar, melampaui batas aman Number (2^53 - 1).

const big = 9007199254740993n; // BigInt
console.log(big + 2n); // 9007199254740995n

Jika menggunakan Number, hasil di atas akan kehilangan presisi. Dengan BigInt, angka besar dapat dihitung dengan aman.


Cara Membuat BigInt

Ada dua cara utama untuk membuat BigInt:

  1. Dengan menambahkan huruf n di akhir literal angka: const a = 12345678901234567890n;
  2. Dengan fungsi BigInt(): const b = BigInt("12345678901234567890");

Operasi dengan BigInt

BigInt mendukung operasi matematika dasar: +, -, *, /, dan %. Namun, pembagian selalu dibulatkan ke bawah.

const x = 10n;
const y = 3n;

console.log(x / y); // 3n (dibulatkan ke bawah)
console.log(x % y); // 1n

Catatan penting: Anda tidak bisa langsung mencampur BigInt dengan Number.

const a = 10n;
const b = 5;
// console.log(a + b); // Error
console.log(a + BigInt(b)); // 15n

Konversi BigInt

Konversi dari BigInt ke Number dapat mengakibatkan kehilangan presisi jika nilainya terlalu besar.

const big = 12345678901234567890n;
console.log(Number(big)); // Bisa kehilangan presisi

Sementara untuk penyimpanan atau transfer data, biasanya BigInt dikonversi ke String.

const data = { id: 12345678901234567890n };
console.log(JSON.stringify({ id: data.id.toString() }));

3. Kapan Menggunakan Symbol dan BigInt?

  • Symbol
    • Untuk membuat kunci properti unik pada objek.
    • Untuk mendefinisikan perilaku khusus melalui well-known symbols.
    • Cocok jika ingin menambahkan data “privat-ish” ke objek.
  • BigInt
    • Untuk perhitungan yang melibatkan angka sangat besar.
    • Untuk ID unik yang melampaui batas angka biasa.
    • Untuk aplikasi seperti kriptografi atau keuangan.

4. Tabel Perbandingan Singkat

FiturSymbolBigInt
Jenis dataPrimitif, unikPrimitif, bilangan bulat besar
Tujuan utamaIdentitas unik, kunci propertiMenghitung angka besar tanpa batas
Operasi matematikaTidak bisaBisa (+, -, *, /, %)
Serialisasi JSONDiabaikanHarus dikonversi ke string dulu
Kapan dipakaiSaat butuh kunci unikSaat butuh angka lebih besar dari Number

Kesimpulan

Symbol dan BigInt adalah tipe data lanjutan yang menambah fleksibilitas JavaScript.

  • Symbol berguna untuk membuat identitas unik, mencegah konflik antar properti, dan mengatur perilaku khusus pada objek.
  • BigInt memungkinkan kita bekerja dengan angka bulat yang sangat besar tanpa kehilangan presisi.

Dengan memahami kedua tipe data ini, pengembang dapat menulis kode yang lebih aman, jelas, dan siap menghadapi kebutuhan aplikasi modern, baik untuk manipulasi objek tingkat lanjut maupun perhitungan numerik berskala besar.