Skip to main content

🧠 Keanehan (Quirks) JavaScript yang Bikin Bingung Tapi Wajib Dipahami

Published 3 min readMarkdown
🧠 Keanehan (Quirks) JavaScript yang Bikin Bingung Tapi Wajib Dipahami

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()

About the author

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

No comments yet. Be the first to comment.

More from this blog