Saya menggunakan JSLint untuk melihat JavaScript, dan mengembalikan banyak saran untuk menggantikan ==
(dua tanda sama dengan) dengan ===
(tiga tanda sama dengan) ketika melakukan hal-hal seperti membandingkan idSele_UNVEHtype.value.length == 0
di dalam sebuah if
pernyataan.
Apakah ada manfaat kinerja untuk mengganti ==
dengan ===
?
Setiap peningkatan kinerja akan disambut karena ada banyak operator pembanding.
Jika tidak ada konversi jenis yang terjadi, apakah akan ada peningkatan kinerja ==
?
=== vs ==
, tetapi dalam PHP, dapat membaca di sini: stackoverflow.com/questions/2401478/why-is-faster-than-in-php/…===
adalah cara lebih cepat dari==
. jsperf.com/comparison-of-comparisons===
lebih==
. Faktanya, benchmark tidak menunjukkan perbedaan besar antara keduanya di browser modern. Secara pribadi, saya biasanya menggunakan di==
mana-mana kecuali saya benar-benar membutuhkan kesetaraan yang ketat.===
dan==
operator: youtube.com/… Jika tidak dimainkan, maka pukul 15:20Jawaban:
Operator kesetaraan yang ketat (
===
) berperilaku identik dengan operator kesetaraan abstrak (==
) kecuali tidak ada konversi tipe yang dilakukan, dan jenisnya harus sama agar dianggap sama.Referensi: Tutorial Javascript: Operator Perbandingan
The
==
Operator akan membandingkan kesetaraan setelah melakukan setiap konversi tipe yang diperlukan . The===
Operator akan tidak melakukan konversi, jadi jika dua nilai yang bukan tipe yang sama===
hanya akan kembalifalse
. Keduanya sama-sama cepat.Mengutip JavaScript luar biasa Douglas Crockford : The Good Parts ,
Memperbarui:
Poin yang bagus disampaikan oleh @Casebash dalam komentar dan dalam jawaban @Phillipe Laybaert mengenai objek. Untuk benda, dan bertindak secara konsisten satu sama lain (kecuali dalam kasus khusus).
==
===
Kasus khusus adalah ketika Anda membandingkan primitif dengan objek yang mengevaluasi ke primitif yang sama, karena yang
toString
atauvalueOf
metode. Sebagai contoh, perhatikan perbandingan string primitif dengan objek string yang dibuat menggunakanString
konstruktor.Di sini
==
operator memeriksa nilai dari dua objek dan kembalitrue
, tetapi===
melihat bahwa mereka bukan tipe yang sama dan kembalifalse
. Yang mana yang benar? Itu benar-benar tergantung pada apa yang Anda coba bandingkan. Saran saya adalah untuk memotong pertanyaan sepenuhnya dan hanya tidak menggunakanString
konstruktor untuk membuat objek string dari string literal.Referensi
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
sumber
Menggunakan
==
operator ( Kesetaraan )Menggunakan
===
operator ( Identity )Ini karena operator kesetaraan
==
memang tipe paksaan , artinya penerjemah secara implisit mencoba untuk mengkonversi nilai-nilai sebelum membandingkan.Di sisi lain, operator identitas
===
tidak melakukan tipe paksaan , dan karenanya tidak mengkonversi nilai saat membandingkan, dan karenanya lebih cepat (sesuai dengan tes benchmark JS ini ) karena melompati satu langkah.sumber
==
"kesetaraan abstrak" dan itu disebut===
"kesetaraan ketat". Memang menyebut==
segala jenis "kesetaraan" itu mengerikan, karena tidak transitif, tetapi mengapa berdalih? Saya mengambil lebih banyak masalah dengan "identitas"; Saya pikir istilah itu cukup menyesatkan, meskipun "berhasil". Tapi serius, siapa yang menciptakan istilah "identitas"? Saya mencari standar dan tidak dapat menemukannya.Representasi gambar yang menarik dari perbandingan kesetaraan antara
==
dan===
.Sumber: http://dorey.github.io/JavaScript-Equality-Table/
var1 === var2
var1 == var2
sumber
x == null
untuk memeriksa apakahx
ininull
atauundefined
.==
vs===
. Huruf besar dan huruf kecil tidak sama, dan akan kembalifalse
dengan operator==
dan keduanya===
. Juga, kata kuncitrue
,false
,undefined
,null
,Infinity
ada di JS hanya dalam satu kasus, dan tidak dapat digunakan dalam kasus-kasus atas atau campuran.Dalam jawaban di sini, saya tidak membaca apa pun tentang apa artinya sama . Beberapa orang akan mengatakan itu
===
berarti sama dan berjenis sama , tetapi itu tidak sepenuhnya benar. Ini sebenarnya berarti bahwa kedua operan referensi objek yang sama , atau dalam kasus tipe nilai, memiliki nilai yang sama .Jadi, mari kita ambil kode berikut:
Hal yang sama di sini:
Atau bahkan:
Perilaku ini tidak selalu jelas. Ada lebih banyak cerita daripada menjadi sama dan menjadi tipe yang sama.
Aturannya adalah:
Untuk tipe nilai (angka):
a === b
mengembalikan true jikaa
danb
memiliki nilai yang sama dan dari tipe yang samaUntuk tipe referensi:
a === b
mengembalikan true jikaa
danb
referensi objek yang sama persisUntuk string:
a === b
mengembalikan true jikaa
danb
keduanya string dan berisi karakter yang sama persisStrings: kasus khusus ...
String bukan tipe nilai, tetapi dalam Javascript mereka berperilaku seperti tipe nilai, jadi mereka akan "sama" ketika karakter dalam string adalah sama dan ketika mereka memiliki panjang yang sama (seperti yang dijelaskan dalam aturan ketiga)
Sekarang menjadi menarik:
Tapi bagaimana dengan ini ?:
Saya pikir string berperilaku seperti tipe nilai? Yah, itu tergantung siapa yang kamu tanyakan ... Dalam hal ini a dan b bukan tipe yang sama.
a
adalah tipeObject
, sedangkanb
tipestring
. Hanya ingat bahwa membuat objek string menggunakanString
konstruktor menciptakan sesuatu tipeObject
yang berperilaku sebagai string sebagian besar waktu .sumber
new Number() == "0"
. Juga di Firefox:(function(){}) == "function () {\n}"
new String("123") !== "123"
. Mereka adalah tipe yang berbeda. Sederhana, namun membingungkan.String
objek berperilaku seperti string seperti halnya objek lainnya .new String
tidak boleh digunakan, karena itu tidak membuat string nyata. Sebuah string nyata dan dapat dibuat dengan string literal atau memanggilString
sebagai fungsi tanpanew
, misalnya:String(0); //"0", Real string, not an object
Izinkan saya menambahkan nasihat ini:
Jika ragu, baca spesifikasinya !
ECMA-262 adalah spesifikasi untuk bahasa scripting yang JavaScript adalah dialeknya. Tentu saja dalam praktiknya itu lebih penting bagaimana peramban yang paling penting berperilaku daripada definisi esoteris tentang bagaimana sesuatu seharusnya ditangani. Tetapi akan sangat membantu untuk memahami mengapa String baru ("a")! == "a" .
Tolong izinkan saya menjelaskan cara membaca spesifikasi untuk memperjelas pertanyaan ini. Saya melihat bahwa dalam topik yang sangat lama ini tidak ada yang punya jawaban untuk efek yang sangat aneh. Jadi, jika Anda dapat membaca spesifikasi, ini akan sangat membantu Anda dalam profesi Anda. Ini adalah keterampilan yang didapat. Jadi, mari kita lanjutkan.
Mencari file PDF untuk === membawa saya ke halaman 56 dari spesifikasi: 11.9.4. Operator Sama Ketat (===) , dan setelah mengarungi spesifik saya menemukan:
Menarik adalah langkah 11. Ya, string diperlakukan sebagai tipe nilai. Tapi ini tidak menjelaskan mengapa String baru ("a")! == "a" . Apakah kita memiliki browser yang tidak sesuai dengan ECMA-262?
Tidak secepat itu!
Mari kita periksa jenis operan. Cobalah sendiri dengan membungkusnya dalam typeof () . Saya menemukan bahwa String baru ("a") adalah objek, dan langkah 1 digunakan: return false jika tipenya berbeda.
Jika Anda bertanya-tanya mengapa String baru ("a") tidak mengembalikan string, bagaimana dengan latihan membaca spesifikasi? Selamat bersenang-senang!
Aidiakapi menulis ini dalam komentar di bawah ini:
baru selalu mengembalikan Obyek, bahkan untuk konstruktor String juga. Dan sayangnya! Semantik nilai untuk string (lihat langkah 11) hilang.
Dan ini akhirnya berarti: String baru ("a")! == "a" .
sumber
new String('x')
, karena saya belum pernah melihat kode di alam liar yang menggunakan objek pembungkus primitif, dan saya tidak berpikir ada banyak alasan bagus untuk, terutama hari ini. Pernahkah Anda menemukan kode yang melakukannya?new String()
.new String()
mungkin adalah kekhawatiran Anda yang paling sedikit. Saya memahami keprihatinan dalam teori, tetapi sekali lagi, apakah Anda memiliki contoh dunia nyata? Bagi saya itu seperti kecemasan lama bahwa seseorang dapat menetapkanundefined
nilai lain.Dalam PHP dan JavaScript, ini adalah operator kesetaraan yang ketat. Yang berarti, itu akan membandingkan jenis dan nilai.
sumber
var a = {}, b = {};
a == b
mengembalikan false.var a = {}, b = {};
Sementara keduanyaa
danb
memang keduanya objek, tetapi mereka tidak memiliki nilai yang sama , secara teknis. Mereka adalah contoh yang berbeda . Perhatikan bahwa membandingkan instance berfungsi berbeda dari membandingkan primitif. Yang mungkin menambah kebingungan ini. Anda akan melihat perilaku perbandingan yang serupa jika Anda menggunakan versi tipe data primitif contoh. Misalnyanew String('asdf')
ataunew Number(5)
. Mis:new Number(5) == new Number(5)
salah, meskipun mereka memiliki nilai yang sama.Saya menguji ini di Firefox dengan Firebug menggunakan kode seperti ini:
dan
Hasil saya (masing-masing diuji lima kali dan rata-rata):
Jadi saya akan mengatakan bahwa perbedaan sangat kecil (ini lebih dari 100.000 iterasi, ingat) diabaikan. Kinerja bukan alasan untuk melakukannya
===
. Ketik keamanan (well, seaman Anda akan mendapatkan JavaScript), dan kualitas kode.sumber
==
tidak setuju.==
operator? Ingat, saat itulah ada peningkatan kinerja.===
lebih dari==
tetapi Anda salah bahwa kinerja mereka pada dasarnya sama dan bahwa Anda akan berpikir tes ini membuktikan bahwa, dan banyak orang lain setuju, benar-benar tidak masuk akal bagi saya.Dalam JavaScript artinya nilai dan jenis yang sama.
Sebagai contoh,
tapi
sumber
The === operator disebut operator perbandingan yang ketat, itu tidak berbeda dari == operator.
Mari kita ambil 2 vars a dan b.
Untuk "a == b" untuk mengevaluasi ke true a dan b perlu nilai yang sama .
Dalam kasus "a === b" a dan b harus memiliki nilai yang sama dan juga jenis yang sama untuk dievaluasi menjadi true.
Ambil contoh berikut
Singkatnya ; menggunakan operator == dapat mengevaluasi true dalam situasi di mana Anda tidak menginginkannya jadi menggunakan operator === akan lebih aman.
Dalam skenario penggunaan 90% itu tidak masalah yang mana yang Anda gunakan, tetapi berguna untuk mengetahui perbedaannya ketika Anda mendapatkan perilaku yang tidak terduga suatu hari.
sumber
Mengapa
==
begitu tak terduga?Apa yang Anda dapatkan ketika Anda membandingkan string kosong
""
dengan angka nol0
?true
Yap, itu benar menurut
==
string kosong dan angka nol adalah waktu yang sama.Dan itu tidak berakhir di sini, ini satu lagi:
Banyak hal menjadi aneh dengan array.
Kemudian aneh dengan string
Itu semakin buruk:
Kapan sama tidak sama?
Izinkan saya mengatakan itu lagi:
Dan ini hanya hal-hal gila yang Anda dapatkan dengan primitif.
Ini benar-benar tingkat gila saat Anda gunakan
==
dengan benda.Pada titik ini Anda mungkin bertanya-tanya ...
Mengapa ini terjadi?
Yah itu karena tidak seperti "triple sama dengan" (
===
) yang hanya memeriksa apakah dua nilai sama.==
melakukan banyak hal lainnya .Ini memiliki penanganan khusus untuk fungsi, penanganan khusus untuk nulls, tidak terdefinisi, string, apa saja.
Agak aneh.
Bahkan, jika Anda mencoba untuk menulis fungsi yang melakukan apa
==
yang akan terlihat seperti ini:Jadi apa artinya ini?
Artinya
==
rumit.Karena rumit, sulit untuk mengetahui apa yang akan terjadi ketika Anda menggunakannya.
Yang berarti Anda bisa berakhir dengan bug.
Jadi moral dari cerita ini adalah ...
Buat hidup Anda lebih mudah.
Gunakan
===
sebagai ganti==
.Tamat.
sumber
looseEqual
salah.Function == Function.toString()
itu benar, tetapilooseEqual(Function, Function.toString())
salah. Tidak yakin mengapa Anda memfilter fungsi di awal.typeof x === "object"
untuk memeriksa apakah itu objek, tetapi `typeof hanya berfungsi untuk primitif non-nol. Anda mungkin tertarik pada daftar cara yang tepat untuk memeriksa apakah suatu nilai adalah objek(function blah() { console.log("test"); }) != {valueOf:function(){return "function blah() { console.log(\"test\"); }";}}
- lihat JS Fiddle ini yang menjalankan semua tes: jsfiddle.net/luisperezphd/7k6gcn6g (ada 1.225 permutasi pengujian)==
melakukan banyak hal sehingga sangat sulit untuk mengantisipasi hasil sementara===
jauh lebih mudah dan dapat diprediksi yang merupakan salah satu alasan utama===
adalah pilihan yang direkomendasikan. (Saya akan menambahkan catatan pada jawaban yang menyebutkan poin Anda)===
memeriksa sisi yang sama dalam jenis dan nilai yang sama .Contoh:
Contoh umum:
Contoh umum lainnya:
Banyak kali sebuah untyped cek akan berguna karena Anda tidak peduli jika nilai baik
undefined
,null
,0
atau""
sumber
'string' !== 'number'
Diagram alir eksekusi Javascript untuk kesetaraan / perbandingan '==='
Diagram alir eksekusi Javascript untuk persamaan / perbandingan tidak ketat '=='
sumber
string
panah menunjuk ke kotak abu-abu besar, apakah itu seharusnya berarti pengganggu sedang melemparkan string ke nomor?string
seharusnya dibandingkan dengan jenisnumber
, jadi pengganggu melihat apa yang harus dibandingkan dengan string dan melemparkan string yang sesuai?ToNumber
akan kembali ketika diberikan tipe yang berbeda, jadi jika diberikan string, ia hanya akan memilih opsi terakhir (dan mengubahnya menjadi angka). hanya==
menggunakanToNumber
dalam kasusstring == number
atau diboolean == anything
atas (dan hanya padastring
/boolean
). Ini berarti==
tidak akan pernah mengkonversiundefined
ataunull
meskipun mereka berada di kotak abu-abu. (Untuk kombinasi salah satuundefined
ataunull
keduanya,==
akan selalu kembalitrue
. Juga, apakah nilai di sisi kiri atau kanan tidak masalah,==
(dan===
) akan mengembalikan hasil yang sama.)JavaScript
===
vs==
.sumber
Ini berarti kesetaraan tanpa paksaan tipe paksaan berarti JavaScript tidak secara otomatis mengkonversi tipe data lain ke tipe data string
sumber
Dalam skrip tipikal tidak akan ada perbedaan kinerja. Yang lebih penting mungkin fakta bahwa ribuan "===" adalah 1 KB lebih berat dari seribu "==" :) JavaScript profiler dapat memberi tahu Anda jika ada perbedaan kinerja dalam kasus Anda.
Tetapi secara pribadi saya akan melakukan apa yang disarankan JSLint. Rekomendasi ini ada bukan karena masalah kinerja, tetapi karena tipe paksaan berarti
('\t\r\n' == 0)
benar.sumber
Operator perbandingan yang sama == membingungkan dan harus dihindari.
Jika Anda HARUS hidup dengannya, maka ingatlah 3 hal berikut:
MEJA KEBENARAN OPERATOR YANG SAMA DI JAVASCRIPT
** STRANGE: perhatikan bahwa dua nilai pada kolom pertama tidak sama dalam arti itu. **
sumber
Tidak mungkin ada perbedaan kinerja antara kedua operasi dalam penggunaan Anda. Tidak ada jenis konversi yang harus dilakukan karena kedua parameter sudah tipe yang sama. Kedua operasi akan memiliki perbandingan tipe diikuti oleh perbandingan nilai.
sumber
Iya! Bermasalah.
===
operator di javascript memeriksa nilai dan juga mengetik di mana sebagai==
operator hanya memeriksa nilai (melakukan konversi jenis jika diperlukan) .Anda dapat dengan mudah mengujinya. Rekatkan kode berikut dalam file HTML dan buka di browser
Anda akan mendapatkan ' false ' dalam peringatan. Sekarang ubah
onPageLoad()
metode agaralert(x == 5);
Anda menjadi kenyataan .sumber
===
Operator memeriksa nilai-nilai serta jenis variabel untuk kesetaraan.==
Operator hanya memeriksa nilai variabel untuk kesetaraan.sumber
Ini tes pemeriksaan yang ketat.
Ini adalah hal yang baik terutama jika Anda memeriksa antara 0 dan false dan null.
Misalnya, jika Anda memiliki:
Kemudian:
Semua mengembalikan true dan Anda mungkin tidak menginginkan ini. Misalkan Anda memiliki fungsi yang dapat mengembalikan indeks ke-0 array atau false pada kegagalan. Jika Anda mengecek "==" salah, Anda bisa mendapatkan hasil yang membingungkan.
Jadi dengan hal yang sama seperti di atas, tetapi tes yang ketat:
sumber
0 != null
. -1JSLint terkadang memberi Anda alasan tidak realistis untuk memodifikasi barang.
===
memiliki kinerja yang persis sama dengan==
olah jenisnya sudah sama.Itu lebih cepat hanya ketika jenis tidak sama, dalam hal ini tidak mencoba untuk mengkonversi jenis tetapi langsung mengembalikan yang salah.
Jadi, IMHO, JSLint mungkin digunakan untuk menulis kode baru, tetapi optimisasi berlebihan yang tidak berguna harus dihindari di semua biaya.
Artinya, tidak ada alasan untuk berubah
==
ke===
dalam cek sepertiif (a == 'test')
ketika Anda mengetahuinya karena fakta bahwa hanya bisa menjadi String.Memodifikasi banyak kode dengan cara itu menghabiskan waktu pengembang dan pengulas dan tidak menghasilkan apa-apa.
sumber
Secara sederhana
==
berarti perbandingan antara operan dengantype conversion
&
===
berarti perbandingan antara operan tanpatype conversion
Konversi tipe dalam javaScript berarti javaScript secara otomatis mengkonversi tipe data lain menjadi tipe data string.
Sebagai contoh:
sumber
Contoh sederhana adalah
sumber
2 jawaban teratas yang disebutkan == berarti persamaan dan === berarti identitas. Sayangnya, pernyataan ini salah.
Jika kedua operan == adalah objek, maka mereka dibandingkan untuk melihat apakah keduanya adalah objek yang sama. Jika kedua operan menunjuk ke objek yang sama, maka operator yang sama mengembalikan true. Kalau tidak, keduanya tidak sama.
Dalam kode di atas, == dan === salah, karena a dan b bukan objek yang sama.
Itu mengatakan: jika kedua operan == adalah objek, == berperilaku sama dengan ===, yang juga berarti identitas. Perbedaan mendasar dari kedua operator ini adalah tentang konversi tipe. == memiliki konversi sebelum memeriksa kesetaraan, tetapi === tidak.
sumber
Sebagai aturan praktis, saya biasanya akan menggunakan
===
bukannya==
(dan!==
bukannya!=
).Alasan dijelaskan dalam jawaban di atas dan juga Douglas Crockford cukup jelas tentang hal itu ( JavaScript: The Good Parts ).
Namun ada satu pengecualian tunggal :
== null
adalah cara yang efisien untuk memeriksa 'apakah nol atau tidak terdefinisi':Misalnya jQuery 1.9.1 menggunakan pola ini 43 kali, dan pemeriksa sintaks JSHint bahkan menyediakan
eqnull
opsi untuk alasan ini.Dari panduan gaya jQuery :
sumber
Masalahnya adalah Anda mungkin dengan mudah mendapat masalah karena JavaScript memiliki banyak konversi tersirat yang berarti ...
Yang segera menjadi masalah. Sampel terbaik mengapa konversi implisit adalah "jahat" dapat diambil dari kode ini di MFC / C ++ yang sebenarnya akan dikompilasi karena konversi implisit dari CString ke HANDLE yang merupakan tipe pointer typedef ...
Yang jelas selama runtime melakukan hal-hal yang sangat tidak jelas ...
Google untuk konversi tersirat dalam C ++ dan STL untuk mendapatkan beberapa argumen yang menentangnya ...
sumber
0 == null
itu salah.Dari referensi javascript inti
sumber
Perbandingan kesetaraan:
Operator
==
Mengembalikan nilai true, ketika kedua operan sama. Operan dikonversi ke jenis yang sama sebelum dibandingkan.
Perbandingan kesetaraan dan jenis:
Operator
===
Mengembalikan nilai true jika kedua operan sama dan dari jenis yang sama. Biasanya lebih baik dan lebih aman jika Anda membandingkan cara ini, karena tidak ada konversi tipe di belakang layar.
sumber
Berikut ini adalah tabel perbandingan yang berguna yang menunjukkan konversi yang terjadi dan perbedaan antara
==
dan===
.Sebagai kesimpulan menyatakan:
http://dorey.github.io/JavaScript-Equality-Table/
sumber
null dan undefined adalah ketiadaan, yaitu,
Di sini
a
danb
tidak memiliki nilai. Sedangkan, 0, false dan '' adalah semua nilai. Satu hal yang umum di antara semua ini adalah bahwa semua itu adalah nilai-nilai palsu, yang berarti semuanya memuaskan kondisi palsu.Jadi, 0, false, dan '' bersama-sama membentuk sub-grup. Dan di sisi lain, null & undefined membentuk sub-grup kedua. Periksa perbandingan pada gambar di bawah ini. null dan undefined akan sama. Tiga lainnya akan sama satu sama lain. Tapi, mereka semua diperlakukan sebagai kondisi palsu dalam JavaScript.
Ini sama dengan objek apa pun (seperti {}, array, dll.), String tidak kosong & Boolean true adalah semua kondisi yang benar. Tapi, mereka semua tidak setara.
sumber