Cara mengatasi object comparison selalu false di JavaScript adalah membandingkan isi properti, bukan objeknya langsung. Operator == dan === hanya mengecek apakah kedua variabel menunjuk ke referensi memori yang sama, sehingga {a: 1} === {a: 1} tetap false walau isinya identik.
Penyebab Object Comparison Selalu False di JavaScript
Ini bukan bug sintaks, melainkan logic error. Kode berjalan tanpa TypeError atau SyntaxError, tetapi logika pengecekannya keliru.
==dan===untuk object membandingkan referensi, bukan isi.- Setiap object literal membuat referensi baru di memori.
- Salinan dengan spread seperti
{...obj}juga punya referensi berbeda.
Tabel Troubleshooting Object Comparison False
Kondisi | Penyebab | Solusi
Tabel berikut merangkum pola yang paling sering muncul:
| Kondisi | Penyebab | Solusi |
|---|---|---|
{} === {} false |
Dua referensi baru | Bandingkan isi key |
| Variabel sama true | Referensi sama | Pertahankan referensi |
| Salinan shallow atau deep false | Object baru walau isi sama | Pakai deep equal |
Cara Memperbaiki Perbandingan Object yang Selalu False
- Pastikan kedua nilai memang object dan bukan null.
- Bandingkan key penting secara manual bila struktur kecil.
- Gunakan
JSON.stringifyhanya untuk object datar sederhana. - Buat fungsi
deepEqualkecil untuk object bersarang.
// SALAH: selalu false
const a = { id: 1 };
const b = { id: 1 };
console.log(a === b);
// BENAR: bandingkan isi
console.log(a.id === b.id);
// BENAR: deep equal sederhana
function isEqual(x, y) {
return Object.keys(x).length === Object.keys(y).length &&
Object.keys(x).every(k => x[k] === y[k]);
}
console.log(isEqual(a, b)); // true
Kode pertama gagal karena a dan b menempati memori berbeda. Pengecekan a.id berhasil karena number dibandingkan berdasarkan nilai. Fungsi isEqual memeriksa jumlah key lalu tiap nilainya. Perhatikan shallow copy hanya menyalin level pertama, sedangkan deep copy menyalin seluruh level. JSON.stringify sensitif terhadap urutan key dan gagal pada object circular.
Cara Mencegah Perbandingan Object Keliru
- Bandingkan
idatau properti kunci, bukan seluruh object. - Normalisasi bentuk data dari API sebelum dibandingkan.
- Hindari
JSON.stringifyuntuk object circular atau berisi function. - Gunakan referensi stabil untuk state, misalnya simpan object acuan dalam variabel.
FAQ
Kenapa {} === {} selalu false di JavaScript?
Karena setiap kurung kurawal membuat object baru dengan referensi memori berbeda.
Apakah JSON.stringify aman untuk bandingkan object?
Aman hanya untuk object datar tanpa circular dan urutan key konsisten.
Kapan perlu fungsi deep equal untuk object?
Perlu saat object bersarang dan perbandingan harus memeriksa semua level properti.