Dua Cara Bertanya "Apakah Keduanya Sama?"
JavaScript memberimu dua operator kesamaan: === (ketat) dan == (longgar). Bentuknya hampir sama. Perilakunya sangat berbeda.
=== mengecek apakah kedua operand bertipe sama dan bernilai sama. == mengubah operand ke tipe bersama terlebih dulu, baru membandingkan. Konversi itu, yang disebut type coercion, adalah sumber utama reputasi buruk kesamaan di JavaScript.
Versi singkatnya: pakai === sebagai default. Versi panjangnya layak dibaca sekali agar kamu tahu apa yang kamu hindari.
Kesamaan Ketat: Yang Mungkin Kamu Inginkan
=== mengembalikan true hanya saat kedua sisi cocok dalam tipe dan nilai. Tanpa coercion, tanpa kejutan:
Kalau tipenya tidak cocok, jawabannya langsung false. Kalau cocok, JavaScript membandingkan nilainya. Untuk tipe primitif itu perbandingan nilai; untuk objek itu perbandingan referensi (dibahas sebentar lagi).
!== adalah operator ketidaksamaan ketat dan mengikuti aturan yang sama secara terbalik.
Kesamaan Longgar: Coercion yang Menyamar
== membiarkan kedua sisi punya tipe yang berbeda. Sebelum membandingkan, ia menjalankan serangkaian coercion untuk mencoba menyamakannya:
Aturan pastinya ada di spesifikasi, dan sebenarnya tidak terlalu buruk, tetapi mengingatnya di tengah debug adalah soal lain. "0" == false yang bernilai true menjebak bahkan developer berpengalaman. Begitu juga [] == false (juga true, karena array diubah menjadi "", yang kemudian diubah menjadi 0).
Inilah sebabnya kebanyakan panduan gaya, termasuk aturan eqeqeq di ESLint, menyuruhmu memakai === sebagai default. Kamu menukar satu karakter ketikan dengan aturan yang benar-benar bisa kamu ingat.
Satu Pola == yang Berguna
Ada satu idiom kesamaan longgar yang layak diketahui: x == null mengembalikan true saat x bernilai null atau undefined, dan false untuk semua yang lain.
Padanan ketatnya adalah x === null || x === undefined, yang berfungsi tetapi lebih ramai dibaca. Banyak codebase mengizinkan == null sebagai satu-satunya pengecualian yang direstui. Pilih satu aturan, lalu terapkan secara konsisten.
Objek Dibandingkan Berdasarkan Referensi
Untuk objek, array, dan fungsi, === dan == sama-sama menanyakan hal yang sama: "Apakah kedua sisi menunjuk ke objek yang sama di memori?" Bukan "apakah isinya sama?"
Dua literal objek dengan isi yang identik tetaplah dua objek yang berbeda. Ini menjebak semua orang setidaknya sekali.
Untuk perbandingan berdasarkan nilai, kamu menulis helper sendiri, memakai library (lodash.isequal), atau melakukan serialisasi dengan JSON.stringify untuk objek sederhana:
JSON.stringify hanya berfungsi untuk data sederhana: ia mengabaikan fungsi, undefined, dan symbol, serta tidak menjamin urutan key di semua engine untuk semua bentuk objek. Ini pengecekan cepat, bukan solusi umum.
NaN Tidak Sama dengan Apa Pun
NaN ("not a number") adalah nilai yang dikembalikan JavaScript saat operasi numerik tidak punya jawaban yang bermakna, seperti 0/0, Number("abc"), atau Math.sqrt(-1). Kedua operator kesamaan mengembalikan false saat salah satu sisinya NaN, termasuk saat kedua sisinya NaN:
Untuk mendeteksi NaN, pakai Number.isNaN(value). Jangan pakai isNaN global yang lebih lama, karena ia mengubah argumennya terlebih dulu, sehingga isNaN("hello") mengembalikan true, yang hampir tidak pernah kamu inginkan.
Object.is: Hampir ===, dengan Dua Perbaikan
Object.is(a, b) berperilaku seperti === kecuali pada dua kasus khusus:
Sebagian besar waktu, === adalah yang kamu inginkan. Pakai Object.is saat kamu secara khusus perlu menganggap NaN sama dengan dirinya sendiri, atau membedakan +0 dari -0. Keduanya jarang, tetapi sesekali penting di kode numerik dan di bagian dalam framework (React memakai Object.is untuk membandingkan state).
Operator Ketidaksamaan Mengikuti Pembagian yang Sama
!== itu ketat, != itu longgar, dan saran yang sama berlaku:
Pakai !== sebagai default. Kalau kamu sudah mengizinkan == null, kamu juga bisa mengizinkan pasangannya, != null, untuk pengecekan "bukan null dan bukan undefined".
Daftar Periksa untuk Membandingkan Sesuatu
Saat kamu perlu membandingkan dua nilai, ikuti langkah ini:
- Primitif, diharapkan bertipe sama? Pakai
===. - Mengecek null atau undefined?
x == nullboleh kalau panduan gayamu mengizinkannya; kalau tidak,x === null || x === undefined. - Mengecek
NaN?Number.isNaN(x). - Membandingkan objek berdasarkan identitas?
===melakukan persis apa yang kamu inginkan. - Membandingkan objek berdasarkan isi? Tulis helper, pakai library, atau lakukan serialisasi. Operator bawaan tidak bisa membantu.
Tetap pakai ===, perlakukan == sebagai alat khusus untuk kasus == null, dan kamu akan terhindar dari keanehan kesamaan yang memenuhi daftar FAQ JavaScript.
Berikutnya: Operator
Kesamaan hanyalah satu bagian dari kumpulan operator JavaScript. Dokumentasi berikutnya membahas sisanya: aritmetika, logika, penugasan, dan operator bentuk singkat yang akan sering kamu andalkan dalam kode sehari-hari.
Pertanyaan yang sering diajukan
Apa bedanya == dan === di JavaScript?
=== adalah kesamaan ketat (strict equality): hasilnya true hanya kalau kedua operand punya tipe yang sama dan nilai yang sama. == adalah kesamaan longgar (loose equality): ia mengubah operand ke tipe yang sama sebelum membandingkan. 1 === '1' bernilai false, tetapi 1 == '1' bernilai true karena == mengubah string menjadi angka terlebih dulu.
Apakah aku harus selalu memakai === di JavaScript?
Sebagai default, ya. === mudah ditebak dan aturannya gampang diingat. Satu pengecualian yang umum adalah x == null, yang dengan praktis mencocokkan null sekaligus undefined. Kebanyakan linter (aturan eqeqeq di ESLint) mewajibkan === dan mengizinkan pola itu sebagai pilihan tambahan.
Mengapa NaN === NaN menghasilkan false?
Spesifikasi IEEE 754 menyatakan bahwa NaN tidak sama dengan apa pun, termasuk dirinya sendiri. Jadi setiap operator kesamaan mengembalikan false kalau melibatkan NaN. Pakai Number.isNaN(x) untuk mengecek apakah sebuah nilai adalah NaN, atau Object.is(NaN, NaN) yang mengembalikan true.
Bagaimana cara membandingkan kesamaan dua objek di JavaScript?
Baik == maupun === membandingkan objek berdasarkan referensi, bukan isinya. {a: 1} === {a: 1} bernilai false karena keduanya objek yang berbeda. Untuk membandingkan berdasarkan nilai, kamu harus menulis pengecekan sendiri, memakai library seperti isEqual dari Lodash, atau melakukan serialisasi dengan JSON.stringify untuk objek sederhana.