Skip to main content

Command Palette

Search for a command to run...

๐Ÿง  Keanehan (Quirks) JavaScript yang Bikin Bingung Tapi Wajib Dipahami

Published
โ€ข3 min read
๐Ÿง  Keanehan (Quirks) JavaScript yang Bikin Bingung Tapi Wajib Dipahami
A

I am an enthusiastic researcher and developer with a passion for using technology to innovate in business and education.

JavaScript adalah bahasa yang fleksibel dan powerful, tapi juga terkenal punya banyak keanehan (quirks) warisan masa lalu. Ini bisa bikin frustrasi, apalagi untuk pemula. Artikel ini membahas beberapa quirks paling umum dan solusinya โ€” lengkap dengan contoh kode.


๐ŸŸก 1. null == undefined โ†’ true, tapi null === undefined โ†’ false

console.log(null == undefined);  // true
console.log(null === undefined); // false

Penjelasan:

  • == melakukan type coercion (perbandingan longgar).

  • === melakukan strict comparison (harus sama jenis dan nilai).

๐Ÿ” Solusi: Gunakan === untuk menghindari kejutan dari coercion.


๐ŸŸก 2. typeof null === "object" โ—๏ธ

console.log(typeof null); // "object"

Penjelasan:

  • Ini bug historis di JavaScript dari tahun 1995 yang tak bisa diperbaiki demi kompatibilitas.

  • Padahal null seharusnya merepresentasikan "tidak ada apa-apa", bukan "object".

๐Ÿ” Solusi:
Gunakan pengecekan eksplisit:

if (value === null) {
  // benar-benar null
}

๐ŸŸก 3. NaN !== NaN โ—๏ธ

console.log(NaN === NaN); // false

Penjelasan:

  • NaN artinya "Not a Number".

  • Satu-satunya nilai di JavaScript yang tidak sama dengan dirinya sendiri.

๐Ÿ” Solusi:
Gunakan Number.isNaN():

console.log(Number.isNaN(NaN)); // true

๐ŸŸก 4. Array Bisa Diisi Kosong Tapi Tetap Panjang

const arr = [];
arr[10] = "sepuluh";
console.log(arr.length); // 11
console.log(arr); // [ <10 empty items>, 'sepuluh' ]

Penjelasan:

  • JavaScript array itu seperti object, bukan list padat seperti di bahasa lain.

  • Bisa ada "lubang" dalam array.

๐Ÿ” Solusi: Gunakan Array.prototype.fill jika ingin array padat.

const arr = new Array(11).fill(null);
arr[10] = "sepuluh";

๐ŸŸก 5. Angka Desimal Bisa Salah Hitung

console.log(0.1 + 0.2); // 0.30000000000000004

Penjelasan:

  • Ini bukan bug JavaScript, tapi karakteristik floating-point IEEE 754 yang juga dipakai di bahasa lain.

  • Bilangan desimal tertentu tidak bisa direpresentasikan dengan akurat di biner.

๐Ÿ” Solusi:
Gunakan pembulatan:

Math.round((0.1 + 0.2) * 100) / 100; // 0.3

๐ŸŸก 6. String Kosong == 0 โ†’ true

console.log("" == 0); // true

Penjelasan:

  • String kosong dikonversi menjadi 0 saat dibandingkan secara longgar (==).

๐Ÿ” Solusi:
Selalu gunakan ===, atau validasi tipe sebelum membandingkan.


๐ŸŸก 7. Boolean dalam Array

console.log([false] == false); // true ๐Ÿ˜ต

Penjelasan:

  • [false] diubah menjadi 'false', lalu dibandingkan longgar dengan false.

๐Ÿ” Solusi: Hindari perbandingan longgar. Gunakan:

console.log([false] === false); // false

๐ŸŸก 8. isNaN("abc") โ†’ true, tapi Number.isNaN("abc") โ†’ false

isNaN("abc"); // true โŒ
Number.isNaN("abc"); // false โœ…

Penjelasan:

  • isNaN melakukan coercion dulu, "abc" โ†’ NaN โ†’ true.

  • Number.isNaN tidak melakukan coercion, hanya true jika nilai benar-benar NaN.

๐Ÿ” Solusi: Gunakan Number.isNaN().


๐ŸŸก 9. parseInt("08") โ†’ 8, tapi parseInt("08", 8) โ†’ 0

parseInt("08");     // 8
parseInt("08", 8);  // 0

Penjelasan:

  • Kalau tidak hati-hati, parseInt bisa mengira angka dengan awalan 0 sebagai oktal.

  • Namun perilaku ini sudah tidak konsisten antar browser dan disarankan hindari.

๐Ÿ” Solusi: Selalu pakai radix (basis) secara eksplisit.

parseInt("08", 10); // 8

๐ŸŸก 10. true + true โ†’ 2, "true" + true โ†’ "truetrue"

console.log(true + true);      // 2 (true = 1)
console.log("true" + true);    // "truetrue"

Penjelasan:

  • true dikonversi ke angka saat operasi numerik โ†’ 1 + 1

  • + juga bisa jadi concatenation kalau salah satu operand string.

๐Ÿ” Solusi: Selalu perhatikan tipe operand sebelum operasi.


โœ… Tips Umum Menghindari Quirks

  • Aktifkan "use strict" di awal file.

  • Gunakan TypeScript untuk mencegah banyak masalah ini.

  • Hindari ==, gunakan ===.

  • Biasakan membaca spesifikasi coercion dan konversi tipe.


๐Ÿง  Kesimpulan

KeanehanGunakan Pengganti
== vs ===Gunakan ===
typeof null === objectGunakan value === null
NaN !== NaNGunakan Number.isNaN()
Array berlubangGunakan Array.fill() atau loop aman
Floating point errorGunakan pembulatan (Math.round)
isNaN() bingungGunakan Number.isNaN()

More from this blog

M

Mizan Tech

223 posts

Membedah Tren dan Teknologi yang Mengubah Dunia.