Apa perbedaan antara ==
dan ===
?
- Bagaimana tepatnya cara
==
kerja perbandingan longgar ? - Bagaimana tepatnya cara
===
kerja perbandingan ketat ?
Apa yang akan menjadi contoh yang bermanfaat?
Apa perbedaan antara ==
dan ===
?
==
kerja perbandingan longgar ?===
kerja perbandingan ketat ?Apa yang akan menjadi contoh yang bermanfaat?
==
dan===
Perbedaan antara ==
operator yang secara longgar sama dan operator yang ===
identik persis dijelaskan dalam manual :
Operator Perbandingan
┌─────────┬──────────────────────────────────── ─────────────────────────────── │ Contoh │ Nama │ Hasil │ ├─────────┼──────────────────────────────────── ─────────────────────────────── │ $ a == $ b │ Sama │ BENAR jika $ a sama dengan $ b setelah jenis juggling. │ │ $ a === $ b │ Identik │ BENAR jika $ a sama dengan $ b, dan mereka memiliki tipe yang sama. │ └─────────┴──────────────────────────────────── ───────────────────────────────
==
perbandingan yang samaJika Anda menggunakan ==
operator, atau operator perbandingan lainnya yang menggunakan perbandingan longgar seperti !=
, <>
atau ==
, Anda selalu harus melihat konteksnya untuk melihat apa, di mana dan mengapa sesuatu dikonversi untuk memahami apa yang sedang terjadi.
Sebagai referensi dan contoh Anda dapat melihat tabel perbandingan dalam manual :
Perbandingan longgar dengan
==
┌───────────────────────┬───────────────────── ┬──────────────┬─────────────────────────────── ┬───────┐ │ │ BENAR │ SALAH │ 1 │ 0 │ -1 │ "1" │ "0" │ "-1" │ NULL │ array () │ "php" │ "" │ ├───────────────────────┼───────────────────── ┼──────────────┼─────────────────────────────── ┼───────┤ │ BENAR │ BENAR │ SALAH │ BENAR │ SALAH │ BENAR │ BENAR │ BENAR │ BENAR │ BENAR AL BENAR │ BENAR │ BENAR │ │ SALAH │ SALAH │ BENAR │ SALAH │ BENAR │ SALAH │ SALAH │ BENAR │ BENAR │ BENAR │ BENAR │ BENAR │ BENAR │ BENAR │ │ 1 │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ 0 │ FALSE │ BENAR │ FALSE │ BENAR │ FALSE │ FALSE │ BENAR │ BENAR │ BENAR │ BENAR │ BENAR │ BENAR │ BENAR │ │ -1 │ BENAR │ FALSE │ FALSE │ FALSE │ BENAR │ FALSE │ FALSE │ BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ │ "1" │ BENAR │ FALSE │ BENAR │ FALSE │ FALSE │ BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ "0" │ FALSE │ BENAR │ FALSE │ BENAR │ FALSE │ FALSE │ BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ "-1" │ BENAR │ FALSE │ FALSE │ FALSE │ BENAR │ FALSE │ BENAR │ BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ │ NULL │ FALSE │ BENAR │ FALSE │ BENAR │ FALSE │ FALSE │ FALSE │ BENAR │ BENAR │ BENAR │ BENAR │ BENAR │ BENAR │ │ array () │ FALSE │ BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ BENAR │ BENAR │ BENAR │ FALSE │ FALSE │ │ "php" │ BENAR │ FALSE │ FALSE │ BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ BENAR │ BENAR │ FALSE │ │ "" │ FALSE │ BENAR │ FALSE │ BENAR │ FALSE │ FALSE │ FALSE │ BENAR │ BENAR │ FALSE │ FALSE │ BENAR │ BENAR │ └───────────────────────┴───────────────────── ┴──────────────┴─────────────────────────────── ┴───────┘
===
Perbandingan identik yang ketatJika Anda menggunakan ===
operator, atau operator perbandingan lainnya yang menggunakan perbandingan ketat seperti !==
atau ===
, maka Anda selalu dapat memastikan bahwa jenisnya tidak akan berubah secara ajaib , karena tidak akan ada konversi yang terjadi. Jadi dengan perbandingan ketat, jenis dan nilai harus sama, bukan hanya nilainya.
Sebagai referensi dan contoh Anda dapat melihat tabel perbandingan dalam manual :
Perbandingan ketat dengan
===
┌───────────────────────┬───────────────────── ┬──────────────┬─────────────────────────────── ┬───────┐ │ │ BENAR │ SALAH │ 1 │ 0 │ -1 │ "1" │ "0" │ "-1" │ NULL │ array () │ "php" │ "" │ ├───────────────────────┼───────────────────── ┼──────────────┼─────────────────────────────── ┼───────┤ │ BENAR │ BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ 1 │ FALSE │ FALSE │ BENAR AL FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ 0 │ FALSE │ FALSE │ FALSE │ BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ -1 │ FALSE │ FALSE │ FALSE │ FALSE │ BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ "1" │ FALSE │ FALSE AL FALSE │ FALSE │ FALSE UE BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ "0" │ FALSE │ FALSE AL FALSE │ FALSE │ FALSE │ BENAR │ BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ │ "-1" │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ BENAR │ BENAR │ FALSE │ FALSE │ FALSE │ FALSE │ │ NULL │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ BENAR │ BENAR │ FALSE │ FALSE │ FALSE │ │ array () │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ BENAR │ BENAR │ FALSE │ FALSE │ │ "php" │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ TRUE │ FALSE │ │ "" │ FALSE │ FALSE AL FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ BENAR │ └───────────────────────┴───────────────────── ┴──────────────┴─────────────────────────────── ┴───────┘
true
ataufalse
. Itu mudah dilemparkan. Semua nilai lain memiliki, untuk semua tujuan praktis, kombinasi hampir tak terbatas. Benarkah"five" == 5
?array(0) == 0
?array(0,0,0) == 0
?0.0000000000000000000000000000000000000000000000000001 == array()
?false
untuk array yang berbeda dalam javascript, tetapitrue
untuk PHP selama nilainya sama ."000" != "00"
,"000" == null
,"000" == false
,"0x0" == false
,array() == 0
,false != null
,array() != null
,false == "0x0"
,false == "000"
. Dalam PHP, itu perilaku yang berlawanan:"000" == "00"
,"000" != null
,"000" != false
,"0x0" != false
,array() != 0
,false == null
,array() == null
,false != "0x0"
,false != "000"
.Operator == melakukan cast di antara dua tipe yang berbeda jika berbeda, sedangkan operator === melakukan 'perbandingan yang aman'. Itu berarti bahwa itu hanya akan mengembalikan true jika kedua operan memiliki tipe dan nilai yang sama.
Contoh:
Peringatan : dua instance dari kelas yang sama dengan anggota yang setara TIDAK cocok dengan
===
operator. Contoh:sumber
Sebuah gambar bernilai ribuan kata:
==
Bagan persamaan kesetaraan PHP Double Equals :PHP Triple Equals
===
Equality chart:Kode sumber untuk membuat gambar-gambar ini:
https://github.com/sentientmachine/php_equality_charts
Meditasi Guru
Mereka yang ingin menjaga kewarasannya, tidak membaca lebih lanjut karena semua ini tidak masuk akal, kecuali untuk mengatakan bahwa ini adalah bagaimana kegilaan-fraktal, dari PHP dirancang.
NAN != NAN
tapiNAN == true
.==
akan mengkonversi operan kiri dan kanan ke angka jika kiri adalah angka. Jadi123 == "123foo"
, tapi"123" != "123foo"
String heksa dalam tanda kutip kadang-kadang merupakan float, dan akan diberikan kejutan untuk mengapung melawan kehendak Anda, menyebabkan kesalahan runtime.
==
tidak transitif karena"0"== 0
, dan0 == ""
tetapi"0" != ""
==
."6" == " 6"
,,"4.2" == "4.20"
dan"133" == "0133"
tapi133 != 0133
. Tetapi"0x10" == "16"
dan"1e3" == "1000"
mengekspos konversi string kejutan menjadi oktal akan terjadi baik tanpa instruksi atau persetujuan Anda, menyebabkan kesalahan runtime.False == 0
,""
,[]
Dan"0"
.Ketika angka cukup besar mereka == Infinity.
Kelas baru adalah == hingga 1.
Berharap:
Jika Anda menggunakan PHP, Anda tidak boleh menggunakan operator sama dengan ganda karena jika Anda menggunakan triple sama dengan, satu-satunya kasus tepi yang perlu dikhawatirkan adalah NAN dan angka yang begitu dekat hingga tak terbatas sehingga mereka dilemparkan ke tak terhingga. Dengan double equals, apa pun bisa mengejutkan
==
apa pun atau, atau kejutan yang dilemparkan melawan kehendak Anda dan!=
untuk sesuatu yang jelas harus sama.Di mana pun Anda menggunakan
==
PHP adalah bau kode yang buruk karena 85 bug di dalamnya diekspos oleh aturan casting implisit yang tampaknya dirancang oleh jutaan pemrogram pemrograman oleh gerakan brown.sumber
Berkenaan dengan JavaScript:
Operator === bekerja sama dengan operator ==, tetapi mengharuskan operan tidak hanya memiliki nilai yang sama, tetapi juga tipe data yang sama.
Misalnya, sampel di bawah ini akan menampilkan 'x dan y sama', tetapi bukan 'x dan y identik'.
sumber
Tambahan untuk jawaban lain tentang perbandingan objek:
== membandingkan objek menggunakan nama objek dan nilainya. Jika dua objek memiliki tipe yang sama dan memiliki nilai anggota yang sama,
$a == $b
menghasilkan true.=== membandingkan id objek internal objek. Sekalipun anggotanya setara,
$a !== $b
jika mereka bukan objek yang sama persis.sumber
Secara sederhana:
== memeriksa apakah setara (hanya nilai)
=== memeriksa apakah sama (nilai && jenis)
Setara vs Sama: An Analogi
1 + 1 = 2 + 0 (setara)
1 + 1 = 1 + 1 (sama) di
PHP:
true == 1 (true - bernilai setara)
true === 1 (false - tidak sama dengan nilai && jenis)
sumber
Ini semua tentang tipe data. Ambil
BOOL
(benar atau salah) misalnya:true
juga sama1
danfalse
juga sama0
Tidak
==
peduli tentang tipe data saat membandingkan: Jadi jika Anda memiliki variabel yaitu 1 (yang juga bisa jaditrue
):$var=1;
Dan kemudian bandingkan dengan
==
:Tapi
$var
sebenarnya tidak samatrue
, kan? Ini memiliki nilai int1
sebagai gantinya, yang pada gilirannya, sama dengan true.Dengan
===
, tipe data diperiksa untuk memastikan dua variabel / objek / apa pun yang menggunakan tipe yang sama.Jadi jika saya lakukan
kondisi itu tidak akan benar, karena
$var !== true
hanya== true
(jika Anda tahu apa yang saya maksud).Mengapa Anda membutuhkan ini?
Sederhana - mari kita lihat salah satu fungsi PHP
array_search()
::The
array_search()
Fungsi hanya pencarian untuk nilai dalam array, dan kembali kunci dari elemen nilai ditemukan di. Jika nilai tidak dapat ditemukan dalam array, ia mengembalikan palsu . Tapi, bagaimana jika Anda melakukanarray_search()
pada nilai yang disimpan dalam elemen pertama array (yang akan memiliki kunci array0
) ....array_search()
fungsi akan mengembalikan 0 ... yang sama dengan false ..Jadi, jika Anda melakukannya:
Jadi, apakah Anda melihat bagaimana ini bisa menjadi masalah sekarang?
Kebanyakan orang tidak menggunakan
== false
ketika memeriksa apakah suatu fungsi mengembalikan false. Sebaliknya, mereka menggunakan!
. Tetapi sebenarnya, ini persis sama dengan menggunakan==false
, jadi jika Anda melakukannya:Jadi untuk hal-hal seperti itu, Anda akan menggunakan
===
gantinya, sehingga tipe data diperiksa.sumber
Salah satu contoh adalah bahwa atribut database bisa nol atau "":
sumber
php == adalah operator pembanding yang membandingkan nilai variabel. Tapi === membandingkan nilai dan tipe data.
Sebagai contoh,
Dalam hal ini output akan menjadi 'Variabel sama', meskipun tipe datanya berbeda.
Tetapi jika kita menggunakan === daripada ==, hasilnya adalah 'Variabel tidak sama'. Php pertama membandingkan nilai variabel dan kemudian tipe data. Di sini nilainya sama, tetapi tipe data berbeda.
sumber
Diberikan
x = 5
1) Operator: == sama dengan ".
x == 8
is false2) Operator: === "sama dengan" (nilai dan tipe)
x === 5
benar,x === "5"
salahsumber
Berhati-hatilah. Ini masalah yang terkenal.
vs.
sumber
Singkatnya, === bekerja dengan cara yang sama seperti yang dilakukan== di sebagian besar bahasa pemrograman lainnya.
PHP memungkinkan Anda untuk membuat perbandingan yang tidak terlalu masuk akal. Contoh:
Meskipun ini memungkinkan untuk beberapa "jalan pintas" yang menarik Anda harus berhati-hati karena fungsi yang mengembalikan sesuatu yang tidak seharusnya (seperti "kesalahan" bukan angka) tidak akan tertangkap, dan Anda akan bertanya-tanya apa yang terjadi.
Dalam PHP, == membandingkan nilai dan melakukan konversi tipe jika perlu (misalnya, string "12343sdfjskfjds" akan menjadi "12343" dalam perbandingan bilangan bulat). === akan membandingkan nilai DAN tipe dan akan mengembalikan false jika jenisnya tidak sama.
Jika Anda melihat di manual PHP, Anda akan melihat bahwa banyak fungsi mengembalikan "false" jika fungsi gagal, tetapi mereka mungkin mengembalikan 0 dalam skenario yang sukses, itulah sebabnya mereka merekomendasikan melakukan "if (function ()! == false) "untuk menghindari kesalahan.
sumber
Beberapa contoh
PS
vs.
sumber
Anda akan menggunakan === untuk menguji apakah suatu fungsi atau variabel salah daripada hanya menyamakan ke false (nol atau string kosong).
Dalam hal ini strpos akan mengembalikan 0 yang akan sama dengan false dalam pengujian
atau
yang bukan apa yang Anda inginkan di sini.
sumber
Adapun kapan harus menggunakan satu di atas yang lain, ambil misalnya
fwrite()
fungsi dalam PHP.Fungsi ini menulis konten ke aliran file. Menurut PHP, "
fwrite()
mengembalikan jumlah byte yang ditulis, atau SALAH pada kesalahan." Jika Anda ingin menguji apakah pemanggilan fungsi berhasil, metode ini cacat:Dapat mengembalikan nol (dan dianggap berhasil), dan kondisi Anda masih terpicu. Cara yang benar adalah:
sumber
PHP adalah bahasa yang diketik secara longgar. Dengan menggunakan operator ganda sama dengan memungkinkan pengecekan variabel yang longgar.
Dengan memeriksa nilai secara longgar akan memungkinkan beberapa nilai yang sama, tetapi tidak sama, untuk disamakan sebagai sama:
Semua nilai ini akan sama dengan menggunakan operator sama dengan ganda.
sumber
Variabel memiliki tipe dan nilai.
Saat Anda menggunakan variabel-variabel ini (dalam PHP), terkadang Anda tidak memiliki tipe yang baik. Misalnya, jika Anda melakukannya
PHP harus mengonversi ("untuk membuang") $ var ke integer. Dalam kasus ini, "$ var == 1" benar karena setiap string yang tidak kosong dilemparkan ke 1.
Saat menggunakan ===, Anda memeriksa bahwa nilai DAN JENIS THE sama, jadi "$ var === 1" salah.
Ini berguna, misalnya, ketika Anda memiliki fungsi yang dapat mengembalikan false (kesalahan) dan 0 (hasil):
Kode ini salah seolah-olah
myFunction()
mengembalikan 0, ini dilemparkan ke false dan Anda tampaknya memiliki kesalahan. Kode yang benar adalah:karena tesnya adalah bahwa nilai kembali "adalah boolean dan salah" dan bukan "dapat dicor salah".
sumber
The
===
Operator seharusnya untuk membandingkan tepat konten kesetaraan sedangkan==
operator yang akan membandingkan kesetaraan semantik. Khususnya itu akan memaksa string ke angka.Kesetaraan adalah subjek yang luas. Lihat artikel Wikipedia tentang kesetaraan .
sumber
sumber
Semua jawaban sejauh ini mengabaikan masalah berbahaya dengan ===. Telah dicatat secara sepintas, tetapi tidak ditekankan, bahwa integer dan double adalah tipe yang berbeda, jadi kode berikut:
memberi:
Perhatikan bahwa ini BUKAN kasus "kesalahan pembulatan". Kedua angka tersebut persis sama hingga ke bit terakhir, tetapi mereka memiliki tipe yang berbeda.
Ini adalah masalah buruk karena program menggunakan === dapat berjalan dengan bahagia selama bertahun-tahun jika semua angka cukup kecil (di mana "cukup kecil" tergantung pada perangkat keras dan OS yang Anda jalankan). Namun, jika secara kebetulan, bilangan bulat kebetulan cukup besar untuk dikonversi menjadi dobel, tipenya diubah "selamanya" walaupun operasi berikutnya, atau banyak operasi, mungkin membawanya kembali ke nilai integer kecil. Dan, itu semakin buruk. Ia dapat menyebar - infeksi dua kali lipat dapat diteruskan ke apa pun yang disentuhnya, satu perhitungan pada satu waktu.
Di dunia nyata, ini mungkin menjadi masalah dalam program yang menangani tanggal di luar tahun 2038, misalnya. Pada saat ini, cap waktu UNIX (jumlah detik sejak 1970-01-01 00:00:00 UTC) akan membutuhkan lebih dari 32-bit, sehingga perwakilan mereka akan "secara ajaib" beralih untuk menggandakan pada beberapa sistem. Oleh karena itu, jika Anda menghitung perbedaan antara dua kali Anda mungkin berakhir dengan beberapa detik, tetapi sebagai ganda, bukan hasil bilangan bulat yang terjadi pada tahun 2017.
Saya pikir ini jauh lebih buruk daripada konversi antara string dan angka karena itu halus. Saya merasa mudah untuk melacak apa yang merupakan string dan apa itu angka, tetapi melacak jumlah bit dalam angka berada di luar jangkauan saya.
Jadi, dalam jawaban di atas ada beberapa tabel yang bagus, tetapi tidak ada perbedaan antara 1 (sebagai bilangan bulat) dan 1 (rangkap halus) dan 1.0 (rangkap jelas). Juga, saran yang harus selalu Anda gunakan === dan jangan pernah == tidak bagus karena === terkadang gagal di mana == berfungsi dengan baik. Juga, JavaScript tidak setara dalam hal ini karena hanya memiliki satu tipe angka (secara internal mungkin memiliki representasi bit-wise yang berbeda, tetapi tidak menyebabkan masalah untuk ===).
Saran saya - jangan gunakan keduanya. Anda perlu menulis fungsi perbandingan sendiri untuk benar-benar memperbaiki kekacauan ini.
sumber
Ada dua perbedaan antara
==
dan===
dalam array dan objek PHP yang saya pikir tidak disebutkan di sini; dua array dengan jenis kunci yang berbeda, dan objek.Dua array dengan jenis kunci yang berbeda
Jika Anda memiliki larik dengan jenis kunci dan larik lain dengan jenis kunci yang berbeda, mereka sangat berbeda (yaitu menggunakan
===
). Itu dapat menyebabkan jika Anda mengurutkan-array, dan mencoba untuk membandingkan array yang diurutkan dengan yang asli.Misalnya, pertimbangkan array kosong. Pertama, kami mencoba mendorong beberapa indeks baru ke array tanpa jenis khusus. Contoh yang baik adalah array dengan string sebagai kunci. Sekarang jauh ke dalam contoh:
Sekarang, kami memiliki larik tidak-diurutkan-kunci (misalnya, 'dia' datang setelah 'Anda'). Pertimbangkan array yang sama, tetapi kami mengurutkan kuncinya berdasarkan abjad:
Tip : Anda dapat mengurutkan array berdasarkan kunci menggunakan fungsi ksort () .
Sekarang Anda memiliki array lain dengan jenis kunci yang berbeda dari yang pertama. Jadi, kita akan membandingkannya:
Catatan : Ini mungkin jelas, tetapi membandingkan dua array berbeda menggunakan perbandingan ketat selalu hasilnya
false
. Namun, dua array sewenang-wenang mungkin sama dengan menggunakan===
atau tidak.Anda akan mengatakan: "Perbedaan ini dapat diabaikan". Lalu saya katakan itu perbedaan dan harus dipertimbangkan dan dapat terjadi kapan saja. Seperti disebutkan di atas, pengurutan kunci dalam array adalah contoh yang bagus.
Benda
Perlu diingat, dua objek berbeda tidak pernah sama ketatnya . Contoh-contoh ini akan membantu:
Catatan : Menetapkan objek ke variabel lain tidak membuat salinan - melainkan membuat referensi ke lokasi memori yang sama dengan objek. Lihat di sini .
Catatan : Pada PHP7, kelas anonim telah ditambahkan. Dari hasil, tidak ada perbedaan antara
new class {}
dannew stdClass()
dalam tes di atas.sumber