JavaScript'te Dizeler arasındaki eşitliği kontrol etmenin doğru yolu nedir?
{} == "[object Object]"
Örneğin, doğru olarak değerlendirilir.
String().equals()
JS'de bir yöntem değil biraz can sıkıcı ...
JavaScript'te Dizeler arasındaki eşitliği kontrol etmenin doğru yolu nedir?
{} == "[object Object]"
Örneğin, doğru olarak değerlendirilir.
String().equals()
JS'de bir yöntem değil biraz can sıkıcı ...
Yanıtlar:
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ı)
true
veyafalse
değ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.
if (typeof foo == "string")
===
operatörü kullanmak ve "Gerçekten, tamamen,% 100 emin ==
olacağından emin olacağım mı?"
++
/ --
) kullanmama tavsiyesidir .
++
veya --
tek satır veya if/else
ifadeleri ya continue
ya new
operatö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 eval
ya with
da 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.
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
new String("a") == "a"
doğrudur (ancak ile olmaz ===
), çünkü sol taraf ilkel dize değerine dönüştürülecektir.
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 String
sınıf, tip değil ilkel string
.
new String(foo)
bir dize nesnesi oluşturur ve String(foo)
foo'yu bir dize ilkeline dönüştürür .
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!
fetch
). Çok teşekkürler.
Ne bu soruya götürdü olduğunu padding
vewhite-spaces
davamı kontrol et
if (title === "LastName")
doSomething();
ve başlık " LastName"
bu yüzden belki böyle bir
trim
işlev kullanmalısınız
var title = $(this).text().trim();
.toString().trim()
daktilo
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.
{}==" "
bana Unexpected token ==
bunu yapmanın doğru yolu neydi?
Javascript dizeleri yapılabilir aslında iki yolu vardır.
var str = 'Javascript';
Bu, temel bir dize değeri oluşturur.
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.valueOf
doğru yoldur.
new String('javascript').valueOf() == new String('javascript').valueOf()
Dize hile Objects
kullanı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);
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.
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
==
.