Salah satu hal yang paling sering membingungkan developer JavaScript pemula — bahkan yang sudah berpengalaman sekalipun — adalah perbedaan antara == dan ===. Keduanya digunakan untuk membandingkan dua nilai, tapi dengan cara yang sangat berbeda. Memahami perbedaan ini penting karena salah penggunaan bisa menghasilkan bug yang sulit dilacak.
== (Loose Equality / Persamaan Longgar)
Operator == membandingkan dua nilai setelah melakukan konversi tipe (type coercion). Jika kedua sisi memiliki tipe data berbeda, JavaScript akan mencoba mengubah salah satunya agar bisa dibandingkan:
// Perbandingan angka dan string
console.log(5 == '5'); // true — string '5' dikonversi ke angka 5
console.log(0 == ''); // true — string kosong dikonversi ke 0
console.log(0 == false); // true — false dikonversi ke 0
console.log(1 == true); // true — true dikonversi ke 1
// Perbandingan dengan null dan undefined
console.log(null == undefined); // true — ini adalah kasus khusus
console.log(null == 0); // false — null hanya == undefined
console.log(null == false); // false — null tidak dikonversi ke false
// Perbandingan dengan string dan boolean
console.log('' == false); // true — keduanya dikonversi ke 0
console.log('1' == true); // true — '1' -> 1, true -> 1
console.log('2' == true); // false — '2' -> 2, true -> 1, tidak sama
=== (Strict Equality / Persamaan Ketat)
Operator === membandingkan nilai tanpa konversi tipe sama sekali. Jika tipe datanya berbeda, hasilnya langsung false:
// Dengan ===, tipe data HARUS sama
console.log(5 === '5'); // false — number vs string
console.log(0 === false); // false — number vs boolean
console.log(1 === true); // false — number vs boolean
console.log('' === false); // false — string vs boolean
console.log(null === undefined); // false — tipe berbeda
// === hanya true jika nilai DAN tipe sama persis
console.log(5 === 5); // true
console.log('halo' === 'halo'); // true
console.log(true === true); // true
console.log(null === null); // true
console.log(undefined === undefined); // true
Mengapa === Lebih Direkomendasikan?
Perilaku type coercion pada == seringkali tidak intuitif dan menjadi sumber bug yang membingungkan. Perhatikan contoh-contoh ini:
// Kasus-kasus membingungkan dengan ==
console.log([] == false); // true — aneh!
console.log([] == ![]); // true — sangat aneh!
console.log('' == 0); // true
console.log(' ' == 0); // true — spasi juga sama dengan 0!
console.log('0' == false); // true
console.log(null == 0); // false — padahal null dianggap "falsy"
// Dengan === semuanya jelas dan predictable
console.log([] === false); // false — jelas tidak sama
console.log('' === 0); // false — jelas tidak sama
console.log('0' === false); // false — jelas tidak sama
Perbandingan null dan undefined
Satu pengecualian populer di mana == justru berguna: memeriksa apakah nilai adalah null atau undefined sekaligus:
function proses(nilai) {
// Cara dengan == — menangkap null DAN undefined sekaligus
if (nilai == null) {
console.log('Nilai null atau undefined, hentikan proses.');
return;
}
console.log('Memproses:', nilai);
}
proses(null); // 'Nilai null atau undefined...'
proses(undefined); // 'Nilai null atau undefined...'
proses(0); // 'Memproses: 0' — 0 tidak termasuk!
proses(''); // 'Memproses: ' — string kosong tidak termasuk!
// Dengan ===, harus tulis kondisi dua kali
if (nilai === null || nilai === undefined) {
// sama efeknya
}
Perbandingan Objek dan Array
Baik == maupun === membandingkan objek dan array berdasarkan referensi, bukan isi:
const a = [1, 2, 3];
const b = [1, 2, 3];
const c = a;
console.log(a == b); // false — referensi berbeda (objek berbeda di memori)
console.log(a === b); // false — referensi berbeda
console.log(a === c); // true — referensi SAMA (c menunjuk ke objek yang sama dengan a)
console.log(a == c); // true — referensi sama
// Untuk membandingkan ISI array/objek, gunakan JSON.stringify (cara sederhana)
console.log(JSON.stringify(a) === JSON.stringify(b)); // true
!= vs !==
Perbedaan yang sama berlaku untuk operator tidak sama:
// != menggunakan type coercion
console.log(5 != '5'); // false — karena 5 == '5' adalah true
// !== ketat, tanpa konversi tipe
console.log(5 !== '5'); // true — karena tipenya berbeda (number vs string)
Aturan Sederhana untuk Diikuti
- Gunakan
===dan!==sebagai default di semua kode JavaScript kamu. - Gunakan
==hanya untuk memeriksanullatauundefinedsekaligus (nilai == null), jika kamu memang ingin itu. - Linter seperti ESLint memiliki aturan
eqeqeqyang akan memperingatkanmu setiap kali menggunakan==.
Kesimpulan
Perbedaan antara == dan === adalah soal apakah JavaScript melakukan konversi tipe sebelum membandingkan atau tidak. Operator == melakukan konversi tipe (type coercion) yang seringkali menghasilkan hasil yang tidak terduga, sementara === membandingkan nilai dan tipe secara ketat tanpa konversi. Gunakan === sebagai kebiasaan default agar kode kamu lebih predictable, mudah dibaca, dan bebas dari bug yang membingungkan.