π§ 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
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() |
About the author
I am an enthusiastic researcher and developer with a passion for using technology to innovate in business and education.
Comments
Join the discussionNo comments yet. Be the first to comment.






