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

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
nullseharusnya 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:
NaNartinya "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 denganfalse.
๐ 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:
isNaNmelakukan coercion dulu,"abc"โ NaN โ true.Number.isNaNtidak 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,
parseIntbisa mengira angka dengan awalan0sebagai 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:
truedikonversi 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
| Keanehan | Gunakan Pengganti |
== vs === | Gunakan === |
typeof null === object | Gunakan value === null |
NaN !== NaN | Gunakan Number.isNaN() |
| Array berlubang | Gunakan Array.fill() atau loop aman |
| Floating point error | Gunakan pembulatan (Math.round) |
isNaN() bingung | Gunakan Number.isNaN() |






