BAB 4 — Tipe Data dalam JavaScript: Memahami Fondasi Nilai & Struktur Program

BAB 4 — Tipe Data dalam JavaScript: Memahami Fondasi Nilai & Struktur Program

JavaScript adalah bahasa dengan dynamic typing—artinya tipe data tidak perlu ditentukan sejak awal, dan sebuah variabel dapat berubah tipe sewaktu-waktu.

Untuk menulis kode yang aman, rapi, dan bebas bug, memahami tipe data adalah langkah krusial.

JavaScript memiliki dua kategori besar tipe data:

  • (1) Primitive types
  • (2) Reference types

Masing-masing memiliki karakteristik, cara kerja, dan konsekuensi berbeda. Bab ini membahas semuanya secara mendalam.


1. Primitive Types

Primitive adalah tipe data sederhana, immutable, dan disimpan langsung pada memori (stack).
JavaScript memiliki 7 primitive type:


A. String

Digunakan untuk teks.

let name = "Alice";
let greet = `Hello, ${name}`;

Ciri-ciri:

  • Menggunakan "...", '...', atau `...`
  • Bersifat immutable → teks tidak bisa diubah, selalu membuat salinan baru ketika dimanipulasi

B. Number

JavaScript memiliki satu jenis number untuk integer dan floating point.

let a = 10;
let b = 10.5;

Kekhususan number:

  • Menggunakan format IEEE 754
  • Bisa menghasilkan NaN, Infinity, -Infinity

C. Boolean

Hanya bernilai:

true
false

Dipakai untuk kondisi dan logika.


D. Null

Mewakili “nilai kosong” yang diset oleh programmer.

let data = null;

Menandakan bahwa variabel memiliki nilai, tetapi kosong.


E. Undefined

Muncul ketika variabel belum diberi nilai.

let x;
console.log(x); // undefined

F. Symbol

Tipe unik untuk membuat identifier yang tidak dapat ditiru.

let id = Symbol("id");

Digunakan untuk properti unik, misalnya pada library atau internal data.


G. BigInt

Digunakan untuk bilangan sangat besar (di luar limit Number).

let big = 123456789012345678901234567890n;

Ditandai dengan akhiran n.


2. Reference Types

Reference types adalah tipe data yang disimpan di heap, dan variabel menyimpan referensi ke lokasi tersebut.

Kategori utamanya:


A. Object

Struktur data kompleks dalam format key–value.

let user = {
  name: "Bob",
  age: 30
};

B. Array

Objek khusus untuk menyimpan daftar/collection.

let items = [1, 2, 3];

C. Function

Function juga merupakan object.

function sayHi() {
  console.log("Hi!");
}

Function sering dianggap first-class object karena dapat disimpan sebagai variabel, argumen, atau return value.


3. Mutable vs Immutable

Memahami perbedaan ini sangat penting:


A. Primitive → Immutable

Contoh:

let a = "Hello";
a[0] = "J"; 
console.log(a); // tetap "Hello"

Jika sebuah string “diubah”, sebenarnya JavaScript membuat nilai baru, bukan memodifikasi nilai lama.


B. Reference Types → Mutable

Object, array, dan function dapat dimodifikasi tanpa membuat referensi baru:

let person = { name: "Anna" };
person.name = "Bella";  // valid

let nums = [1, 2];
nums.push(3);  // valid

Ini sering menjadi sumber bug karena dua variabel dapat menunjuk ke objek yang sama:

let a = { x: 1 };
let b = a;

b.x = 99;
console.log(a.x); // 99 (karena referensinya sama)

4. typeof dan Masalah-Masalahnya

Operator typeof digunakan untuk mengecek tipe data, tetapi memiliki beberapa hasil aneh.

Sintaks:

typeof nilai

Contoh umum:

typeof "Hello"    // "string"
typeof 10         // "number"
typeof true       // "boolean"
typeof undefined  // "undefined"
typeof Symbol()   // "symbol"
typeof 10n        // "bigint"

Masalah 1: typeof null"object"

Ini adalah bug berusia puluhan tahun dalam JavaScript.

typeof null; // "object" (bug, tapi dibiarkan demi kompatibilitas)

Seharusnya hasilnya “null”, tetapi tidak bisa diperbaiki tanpa merusak jutaan situs.


Masalah 2: Array terdeteksi sebagai “object”

typeof [1,2,3]; // "object"

Untuk mengecek array, gunakan:

Array.isArray(arr); // true

Masalah 3: Function adalah “function”, tapi secara teknis object

typeof function(){} // "function"

Hasil “function” sebenarnya hanya pengecualian, karena function adalah objek callable.


Masalah 4: typeof NaN → “number”

typeof NaN; // "number"

Ini adalah konsekuensi dari sistem number IEEE 754.

Untuk mengecek NaN, gunakan:

Number.isNaN(value)

Ringkasan Cepat

Tipe Data Kategori Deskripsi
string primitive teks
number primitive angka
boolean primitive true/false
null primitive nilai kosong
undefined primitive belum diberi nilai
symbol primitive identifier unik
bigint primitive angka besar
object reference data kompleks
array reference list/collection
function reference dapat dipanggil