Apa cara yang benar untuk memeriksa kesetaraan string dalam JavaScript?

844

Apa cara yang benar untuk memeriksa kesetaraan antara String dalam JavaScript?

JSS
sumber
2
Apakah ada alasan untuk tidak menggunakan ==?
Kendrick
21
@Kendrick - tentu saja. Sistem paksaan tipe ini bisa sangat tidak intuitif dan bisa membuat kesalahan sangat mudah untuk diabaikan ( kelihatannya benar, tetapi bisa juga sangat salah)
STW
20
@Kendrick - karena {} == "[object Object]"bernilai true, misalnya.
Chetan Sastry
12
agak menyebalkan itu String().equals()bukan metode di JS ...
Alexander Mills
2
@AlexanderMills Mengapa?
Ry-

Jawaban:

624

Selalu Sampai Anda sepenuhnya memahami perbedaan dan implikasi dari penggunaan==dan===operator, gunakan===operator karena itu akan menyelamatkan Anda dari bug dan WTF yang tidak jelas (tidak jelas). Operator "biasa"==dapat memiliki hasil yang sangat tidak terduga karena tipe-paksaan secara internal, jadi===selalu menggunakan pendekatan yang direkomendasikan.

Untuk mengetahui hal ini, dan bagian-bagian lain dari Javascript "baik vs. buruk" bacalah tentang Tn. Douglas Crockford dan karyanya. Ada Google Tech Talk yang hebat di mana ia merangkum banyak info bagus: http://www.youtube.com/watch?v=hQVTIJBZook


Memperbarui:

Seri You Don't Know JS oleh Kyle Simpson sangat bagus (dan gratis untuk dibaca online). Serial ini masuk ke bidang bahasa yang umumnya disalahpahami dan menjelaskan "bagian buruk" yang Crockford sarankan agar Anda hindari. Dengan memahami mereka, Anda dapat memanfaatkannya dengan benar dan menghindari jebakan.

Buku " Naik & Pergi " mencakup bagian tentang Kesetaraan , dengan ringkasan spesifik kapan harus menggunakan operator yang longgar ( ==) vs ketat ( ===):

Untuk merinci banyak detail menjadi beberapa takeaways sederhana, dan membantu Anda mengetahui apakah akan digunakan ==atau ===dalam berbagai situasi, berikut adalah aturan sederhana saya:

  • Jika salah satu nilai (alias sisi) dalam suatu perbandingan dapat berupa trueatau falsenilainya, hindari ==dan gunakan=== .
  • Jika salah satu nilai dalam perbandingan bisa menjadi nilai-nilai tertentu tersebut ( 0, "", atau []- array kosong), menghindari ==dan penggunaan ===.
  • Dalam semua kasus lain, Anda aman digunakan ==. Tidak hanya aman, tetapi dalam banyak kasus ini menyederhanakan kode Anda dengan cara yang meningkatkan keterbacaan.

Saya masih merekomendasikan ceramah Crockford untuk pengembang yang tidak ingin menginvestasikan waktu untuk benar-benar memahami Javascript — itu saran yang bagus untuk pengembang yang hanya sesekali bekerja di Javascript.

STW
sumber
7
Ini tidak perlu ketika Anda yakin kedua operan adalah string, misalnya, ketika menggunakanif (typeof foo == "string")
Marcel Korpel
25
@ Marscel - Anda benar, tetapi jauh lebih baik untuk selalu menggunakan ===operator dan tidak perlu khawatir tentang "apakah saya benar-benar, 100% yakin yang ==akan berperilaku seperti yang saya pikirkan?"
STW
7
@ STW - salah satu contoh mengapa Crockford bukan alfa dan omega dari JavaScript, adalah sarannya untuk tidak menggunakan kenaikan / penurunan unary ( ++/ --).
Marcel Korpel
10
Dan tidak pernah menggunakan ++atau --atau if/elsepernyataan garis tunggal continueatau newoperator atau sejumlah praktik kode sah lainnya yang dianggap "berbahaya" oleh Crockford. Dan tentu saja tidak pernah mempertimbangkan untuk menggunakan evalatau withbahkan jika jebakan mereka dipahami dengan baik. Dan sudahkah Anda melihat versi JS selanjutnya? Sintaksis yang lebih ketat dan beberapa fungsi pembantu, beberapa yang telah beredar selama bertahun-tahun, adalah tentang semua yang kita dapatkan setelah sekian lama. Sintaksnya belum berevolusi sama sekali. Jika Crockford ada di balik ini, maka itu adalah hal yang buruk.
MooGoo
4
@CoffeeAddict - tes cepat di JSFiddle tampaknya tidak setuju. Keduanya peka huruf besar-kecil: jsfiddle.net/st2EU
STW
205

Jika Anda tahu mereka adalah string, maka tidak perlu memeriksa jenisnya.

"a" == "b"

Namun, perhatikan bahwa objek string tidak akan sama.

new String("a") == new String("a")

akan kembali salah.

Panggil metode valueOf () untuk mengubahnya menjadi primitif untuk objek String,

new String("a").valueOf() == new String("a").valueOf()

akan mengembalikan true

Anurag
sumber
4
terima kasih untuk JSS itu, dua objek string tidak akan pernah sama kecuali mereka adalah objek yang sama terlepas dari nilainya.
Anurag
4
@ JSS: Selain itu, new String("a") == "a"itu benar (tetapi tidak akan dengan ===), karena sisi kiri akan dikonversi menjadi nilai string primitif.
Matthew Crumley
5
@JSS: new String("a") == new String("a"), new String("a") === new String("b"), new String("a") === new String("a")semua akan kembali false, karena Anda sedang berhadapan dengan referensi ke objek dari Stringkelas, tidak primitif dari jenis string.
palswim
4
Hanya untuk memperjelas ini bagi siapa saja yang membacanya. new String(foo)membuat objek string , dan String(foo) mengonversi foo ke string primitif.
Brigand
9
@FakeRainBrigand - sejernih lumpur, tapi itulah javascripts tentang, bukan?
Periata Breatta
59

Hanya satu tambahan untuk jawaban: Jika semua metode ini mengembalikan false, bahkan jika string tampaknya sama, ada kemungkinan spasi putih di sebelah kiri dan atau kanan satu string. Jadi, cukup beri tanda .trim()pada akhir string sebelum membandingkan:

if(s1.trim() === s2.trim())
{
    // your code
}

Saya kehilangan banyak waktu untuk mencari tahu apa yang salah. Semoga ini bisa membantu seseorang!

akelec
sumber
1
Terima kasih banyak. Ini aneh bagi saya, karena saya memastikan tidak ada spasi putih ke kiri atau kanan dan tetap ini adalah satu-satunya cara untuk menyelesaikan masalah saya. Mungkin ini terkait dengan representasi internal string?
Niko
2
Terima kasih @akelec !! @Niko, kemungkinan karena karakter Zero-Width-Space yang tidak terlihat oleh mata telanjang. Lihat en.wikipedia.org/wiki/Zero-width_space . Meskipun karakter ini memiliki tujuan, banyak pengembang membenci keberadaannya!
stwr667
Terima kasih yang membuat frustrasi karena pemeriksaan kesetaraan di saya jika gagal namun saya tidak melihat spasi ketika memeriksa saat debugging.
drzounds
Masalah umum saat memuat variabel dari file teks (yaitu: menggunakan fetch). Terima kasih banyak.
Sopalajo de Arrierez
@ SopalajodeArrierez, tepatnya, sebagian besar ruang atau carriage return di akhir string. Sama sama.
akelec
22

apa yang mengarahkan saya ke pertanyaan ini adalah paddingdanwhite-spaces

periksa kasus saya

 if (title === "LastName")
      doSomething();

dan judulnya adalah " LastName"

masukkan deskripsi gambar di sini

jadi mungkin Anda harus menggunakan trimfungsi seperti ini

var title = $(this).text().trim();
Basheer AL-MOMANI
sumber
2
Terima kasih sama di sini saya gunakan .toString().trim()dalam naskah
Akitha_MJ
17

Kecuali Anda benar-benar tahu cara kerja paksaan, Anda harus menghindari ==dan menggunakan operator identitas ===sebagai gantinya. Tetapi Anda harus membaca ini untuk memahami cara kerjanya .

Jika Anda menggunakan ==, Anda membiarkan bahasa melakukan beberapa jenis paksaan untuk Anda, jadi misalnya:

"1" == 1 // true
"0" == false // true
[] == false // true

Seperti yang dikatakan Douglas Crockford dalam bukunya:

Itu selalu lebih baik menggunakan operator identitas.

ludico8
sumber
3
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
Parkash Kumar
{}==" "memberi saya Unexpected token ==apa cara yang benar untuk melakukannya?
Basheer AL-MOMANI
12

Sebenarnya ada dua cara di mana string dapat dibuat dalam javascript.

  1. var str = 'Javascript'; Ini menciptakan nilai string primitif.

  2. var obj = new String('Javascript');Ini menciptakan objek tipe pembungkus String.

    typeof str // string
    typeof obj // object

Jadi cara terbaik untuk memeriksa kesetaraan adalah menggunakan === operator karena memeriksa nilai serta jenis kedua operan.

Jika Anda ingin memeriksa kesetaraan antara dua objek maka menggunakan String.prototype.valueOfadalah cara yang benar.

new String('javascript').valueOf() == new String('javascript').valueOf()
Abhishek
sumber
6

String Objectsdapat diperiksa menggunakan JSON.stringyfy()trik.

var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);

Muhammad Usman
sumber
1

Mempertimbangkan bahwa kedua string mungkin sangat besar, ada 2 pendekatan utama bitwise searchdanlocaleCompare

Saya merekomendasikan fungsi ini

function compareLargeStrings(a,b){
    if (a.length !== b.length) {
         return false;
    }
    return a.localeCompare(b) === 0;
}
Nagibaba
sumber
-2

Cara termudah untuk melakukannya adalah dengan menggunakan operator ternary seperti:

 "was" == "was" ? true : false

tetapi jika string yang ingin Anda bandingkan ada dalam array, Anda akan menggunakan filter es6

let stringArray  = ["men", "boys", "girls", "sit", "can", "gotten"]
stringArray.filter(I=> I === boys ? 
stringArray.pop(indexOf(I)) : null)

di atas akan memeriksa stringArray Anda dan string apa pun yang cocok dengan itu dari array yang dalam kasus kami kami memilih "anak laki-laki"

Pedro JR
sumber
-8

Saya datang dengan solusi alternatif selama pengujian. Anda dapat menggunakan fungsi pada prototipe string.

String.prototype.betwenStr = function(one){

return JSON.stringify(new String(this)) === JSON.stringify(new String(one));

}


 //call it
 "hello world".betweenStr("hello world"); //returns boolean 
 //value

berfungsi dengan baik di browser chrome

Khorram Bin Salim Khondkar
sumber
Pertanyaannya menanyakan bagaimana memeriksa apakah "hello world" = "hello world", bukan bagaimana memeriksa apakah "hello world" adalah sebuah string.
Nick
4
Ini konyol. Anda telah membuat versi Rube Goldberg ==.
JJJ
Hai OP, hasil edit Anda benar-benar berbeda di bagian spiritualnya, dan jawaban Anda sudah terlalu banyak downvotes. Saya mendesak Anda untuk menghapus jawaban ini dan memposting yang baru dengan versi yang sudah diedit
Yılmaz Durmaz