JavaScript'te dize eşitliğini kontrol etmenin doğru yolu nedir?


843

JavaScript'te Dizeler arasındaki eşitliği kontrol etmenin doğru yolu nedir?


2
== kullanmamanın bir nedeni var mı?
Kendrick

21
@Kendrick - tabi. Bu tip zorlama sistemi inanılmaz derecede sezgisel olmayabilir ve hataları gözden kaçırmayı çok kolay hale getirebilir (doğru görünüyor , ancak çok yanlış olabilir)
STW

20
@Kendrick - {} == "[object Object]"Örneğin, doğru olarak değerlendirilir.
Chetan Sastry

12
String().equals()JS'de bir yöntem değil biraz can sıkıcı ...
Alexander Mills

2
@AlexanderMills Neden?
Ry-

Yanıtlar:


624

her zaman== ve===işleçlerinikullanmanın farklarını ve sonuçlarını tam olarak===anlayana kadar, sizi belirsiz (açık olmayan) hatalardan ve WTF'lerden kurtaracağından operatörükullanın. "Normal"==operatör, dahili olarak zorlama nedeniyle çok beklenmedik sonuçlara sahip olabilir, bu nedenle kullanmak===her zaman önerilen yaklaşımdır.

Bunun ve Javascript'in diğer "iyi ve kötü" bölümleri hakkında bilgi edinmek için Bay Douglas Crockford ve çalışmalarını okuyun. Çok sayıda iyi bilgiyi özetlediği harika bir Google Tech Talk var: http://www.youtube.com/watch?v=hQVTIJBZook


Güncelleme:

Kyle Simpson'ın The Don't Know JS serisi mükemmel (ve çevrimiçi ücretsiz olarak okunabilir). Dizi, dilin yaygın olarak yanlış anlaşılan alanlarına giriyor ve Crockford'un kaçınmanızı önerdiği "kötü kısımları" açıklıyor. Onları anlayarak bunları uygun şekilde kullanabilir ve tuzaklardan kaçınabilirsiniz.

" Yukarı ve Devam Ediyor " kitabı , gevşek ( ) ve katı ( ) işleçlerin ne zaman kullanılacağına ilişkin bu özetin bulunduğu Eşitlik bölümünü içerir :=====

Birkaç ayrıntıyı birkaç basit pakete kaynatmak ve çeşitli durumlarda ==veya ===çeşitli durumlarda kullanmanıza yardımcı olmak için basit kurallar şunlardır:

  • Karşılaştırmadaki değerlerden biri (aka tarafı) trueveya falsedeğeri olabilirse, kaçının ==ve kullanın ===.
  • Bir karşılaştırma halinde değeri, bu özel değerler (içinde olabilir 0, ""ya da [], kaçının - boş bir dizi) ==ve kullanımı ===.
  • Diğer tüm durumlarda, güvenle kullanabilirsiniz ==. Sadece güvenli olmakla kalmaz, aynı zamanda kodunuzu okunabilirliği artıracak şekilde basitleştirir.

Hala Javckcript'i gerçekten anlamak için zaman harcamak istemeyen geliştiriciler için Crockford'un konuşmasını öneriyorum - sadece zaman zaman Javascript'te çalışan bir geliştirici için iyi bir tavsiye.


7
Her iki işlenenin de dize olduğundan emin olmanız gerekmez, örneğin, kullanırkenif (typeof foo == "string")
Marcel Korpel

25
@Marcel - haklısınız, ancak her zaman=== operatörü kullanmak ve "Gerçekten, tamamen,% 100 emin ==olacağından emin olacağım mı?"
STW

7
@STW - Crockford'un neden JavaScript'in alfa ve omega olmadığı bir örneği, tekli artış / azalış ( ++/ --) kullanmama tavsiyesidir .
Marcel Korpel

10
Ve hiç kullanmıyorum ++veya --tek satır veya if/elseifadeleri ya continueya newoperatörü veya Crockford "zararlı" olarak kabul ettiğini tamamen meşru kod uygulamalarının başka bir numara. Ve tabii ki asla hiç bile kullanmayı düşünmediğini düşünün evalya withda tuzaklar iyi anlaşılmış olsa bile. Ve JS'nin bir sonraki sürümünü gördünüz mü? Daha sıkı sözdizimi ve bazıları yıllardır yüzen birkaç yardımcı işlev, bunca zamandan sonra elde ettiğimiz şeyle ilgilidir. Sözdizimi hiç gelişmedi. Crockford bunun arkasındaysa, o zaman kötü bir şey oldu.
MooGoo

4
@CoffeeAddict - JSFiddle'daki hızlı bir test katılmıyor gibi görünüyor. İkisi de büyük / küçük harfe duyarlıdır: jsfiddle.net/st2EU
STW

205

Bunların dize olduğunu biliyorsanız, türü kontrol etmeye gerek yoktur.

"a" == "b"

Ancak, dize nesnelerinin eşit olmayacağını unutmayın.

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

yanlış döndürür.

String nesneleri için bir ilkeye dönüştürmek için valueOf () yöntemini çağırın,

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

doğru dönecek


4
Bu JSS için teşekkür ederiz, değerinden bağımsız olarak aynı nesne olmadıkça iki dize nesnesi asla eşit olmaz.
Anurag

4
@JSS: Ek olarak, new String("a") == "a"doğrudur (ancak ile olmaz ===), çünkü sol taraf ilkel dize değerine dönüştürülecektir.
Matthew Crumley

5
@JSS: new String("a") == new String("a"), new String("a") === new String("b"), new String("a") === new String("a")bütün olacak dönüş false, size nesnelere referanslarla ilgilendiğimize Stringsınıf, tip değil ilkel string.
palswim

4
Bunu okuyan herkes için açıklığa kavuşturmak için. new String(foo)bir dize nesnesi oluşturur ve String(foo) foo'yu bir dize ilkeline dönüştürür .
Brigand

9
@FakeRainBrigand - çamur gibi temiz, ama javascripts bununla ilgili, değil mi?
Periata Breatta

58

Yanıtlara yalnızca bir ek: Tüm bu yöntemler yanlış döndürürse, dizeler eşit görünse bile, bir dizenin solunda veya sağında bir boşluk olması mümkündür. Bu yüzden, .trim()karşılaştırma yapmadan önce dizelerin sonuna bir a koyun :

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

Neyin yanlış olduğunu anlamaya çalışırken saatlerimi kaybettim. Umarım bu birine yardımcı olur!


1
Çok teşekkürler. Yine de benim için garip, çünkü solda veya sağda boşluk olmadığından emin oldum ve yine de sorunumu çözmenin tek yolu buydu. Belki bir dizenin iç temsili ile ilgilidir?
Niko

2
Teşekkürler @akelec !! @Niko, muhtemelen çıplak gözle görülemeyen Sıfır Genişlikli Uzay karakterinden kaynaklanıyordu. Bkz. En.wikipedia.org/wiki/Zero-width_space . Bu karakterin amaçları olmasına rağmen, birçok geliştirici varlığına kızıyor!
stwr667

Benim eşitlik kontrol başarısız eğer öyleydi çünkü sinir bozucu teşekkür ederim henüz hata ayıklama sırasında teftiş yaparken hiçbir boşluk gördüm.
drzounds

Metin dosyasından bir değişken yüklenirken sık karşılaşılan bir sorun (ör.: Using fetch). Çok teşekkürler.
Sopalajo de Arrierez

@SopalajodeArrierez, tam olarak, ipin sonunda çoğunlukla bir boşluk veya bir satır başı var. Rica ederim.
akelec

22

Ne bu soruya götürdü olduğunu paddingvewhite-spaces

davamı kontrol et

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

ve başlık " LastName"

resim açıklamasını buraya girin

bu yüzden belki böyle bir trimişlev kullanmalısınız

var title = $(this).text().trim();

2
Aynı teşekkürler burada kullandığım .toString().trim()daktilo
Akitha_MJ

17

Zorlamanın nasıl çalıştığını gerçekten bilmiyorsanız, bunun yerine ==kimlik operatörünü kullanmaktan kaçınmalısınız ===. Ama nasıl çalıştığını anlamak için bunu okumalısınız .

Eğer kullanırsanız ==, dil böylece örneğin, sizin için bazı tip zorlama yapalım:

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

Douglas Crockford'un kitabında söylediği gibi:

Kimlik operatörünü kullanmak her zaman daha iyidir.


3
Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir.
Parkash Kumar

{}==" "bana Unexpected token ==bunu yapmanın doğru yolu neydi?
Basheer AL-MOMANI

12

Javascript dizeleri yapılabilir aslında iki yolu vardır.

  1. var str = 'Javascript'; Bu, temel bir dize değeri oluşturur.

  2. var obj = new String('Javascript');Bu tür bir sarıcı nesne oluşturur String.

    typeof str // string
    typeof obj // object

Eşitliği kontrol etmenin en iyi yolu ===operatörü kullanmaktır çünkü her iki işlenenin değerini ve değerini kontrol eder.

İki nesne arasındaki eşitliği kontrol etmek istiyorsanız, o zaman kullanmak String.prototype.valueOfdoğru yoldur.

new String('javascript').valueOf() == new String('javascript').valueOf()

6

Dize hile Objectskullanılarak kontrol edilebilir JSON.stringyfy().

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


1

Her iki dizgenin çok büyük olabileceği düşünüldüğünde, 2 ana yaklaşım vardır bitwise searchvelocaleCompare

Bu işlevi tavsiye ettim

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

-2

Bunu yapmanın en kolay yolu üçlü bir operatör kullanmaktır:

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

ancak karşılaştırmak istediğiniz dize bir dizideyse, es6 filtresini kullanırsınız

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

yukarıdakiler stringArray öğenizi ve dizimizle eşleşen dizeyi kontrol eder.


-8

Testler sırasında alternatif bir çözüm buldum. string prototipinde fonksiyon kullanabilirsiniz.

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

krom tarayıcılarda iyi çalışır


Soru, "merhaba dünya" nın bir dize olup olmadığını nasıl kontrol edeceğinizi değil, "merhaba dünya" = "merhaba dünya" nın nasıl kontrol edileceğini sorar.
Nick

4
Bu sadece aptalca. Adlı kişinin Rube Goldberg sürümünü oluşturdunuz ==.
JJJ

Merhaba OP, düzenlemeniz manevi kısmında tamamen farklı ve cevabınızın zaten çok fazla downvotes var. Lütfen bu yanıtı kaldırmanızı ve düzenlediğiniz sürümle yeni bir yanıt göndermenizi tavsiye ederim
Yılmaz Durmaz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.