๐ง 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.
Search for a command to run...

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.
Ringkasan: Jika OpenClaw adalah AI Operating System yang menghubungkan berbagai layanan dan agent, maka Hermes adalah AI Worker yang fokus mengerjakan pekerjaan, belajar dari pengalaman, dan semakin p

Ketika membangun aplikasi modern seperti Next.js, Cloudflare Workers, platform AI, microservices, atau real-time dashboard, ada banyak istilah jaringan yang sering muncul: TCP, UDP, HTTP/2, QUIC, WebS

Setiap tahun, ribuan mahasiswa jurusan Teknologi Informasi, Sistem Informasi, dan Teknik Informatika diwisuda. Namun, tidak sedikit di antara mereka yang kemudian menghadapi kenyataan yang cukup berat

Jika Anda menggunakan Next.js, kemungkinan besar Anda pernah mendengar anggapan bahwa: "Next.js = Vercel" Padahal kenyataannya tidak harus demikian. Di sinilah OpenNext hadir. OpenNext adalah proyek

Saat pertama kali mencoba OpenCode Go, saya hampir langsung berlangganan tanpa membaca detail program yang mereka sediakan. Untungnya saya menemukan bahwa OpenCode memiliki program referral yang membe

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.
null == undefined โ true, tapi null === undefined โ falseconsole.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.
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
}
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
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";
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
trueconsole.log("" == 0); // true
Penjelasan:
==).๐ Solusi:
Selalu gunakan ===, atau validasi tipe sebelum membandingkan.
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
isNaN("abc") โ true, tapi Number.isNaN("abc") โ falseisNaN("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().
parseInt("08") โ 8, tapi parseInt("08", 8) โ 0parseInt("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
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.
Aktifkan "use strict" di awal file.
Gunakan TypeScript untuk mencegah banyak masalah ini.
Hindari ==, gunakan ===.
Biasakan membaca spesifikasi coercion dan konversi tipe.
| 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() |