if ifadesinde boole


144

Bugün, bir okul ödevinde bir değişkenin doğru veya yanlış olup olmadığını kontrol etme şeklimi göz önünde bulundurarak kod hakkında bir açıklama aldım.

Yazdığım kod böyle bir şeydi:

var booleanValue = true;

function someFunction(){
    if(booleanValue === true){
        return "something";
    }
}

Böyle yazmanın daha iyi / daha temiz olduğunu söylediler:

var booleanValue = true;

function someFunction(){
    if(booleanValue){
        return "something";
    }
}

"=== true" kısmı hakkında aldığım açıklama, bunun gerekli olmadığı ve karışıklık yaratabileceğiydi.

Ancak benim fikrim, özellikle Javascript'in gevşek tipli bir dil olması nedeniyle değişkenin bir boolean olup olmadığını kontrol etmek daha iyidir.

İkinci örnekte, bir dize "bir şey" de döndürür;

Benim sorum; Gelecekte "=== true" kısmını kaybetmek daha mı düzenli, yoksa değişkenin türünü de kontrol etmek iyi bir uygulamadır.

Düzenleme: Benim "gerçek" kodunda boolean bir görüntü silinmiş olup olmadığını gösterir, bu nedenle boolValue hiç olması gereken tek değer doğru veya yanlış.

Örneğin 0 ve 1 bu değişkente olmamalıdır.


4
=== okunabilir ve iyi bir uygulamadır
Piyas De

2
İçin +1 === true. Karışıklığı önler !!
gashu

1
@gashu [0] === truefalse olarak değerlendirmeyi düşünün .
RestingRobot

1
@Jlange değil mi? Lütfen açıklayın
gashu

Bununla kastettiğim, eğer basitçe bir "doğruluk" varlığını kontrol etmek isteseydin, bu ifadeyi doğru olarak değerlendirse bile başarısız olur ([0] doğru olarak değerlendirir ama tip dönüşümü olmadan değil). Bu gerçekten ifadenizle neyi başarmaya çalıştığınıza bağlıdır. Koşulun === truetam olarak eşit olduğundan emin olmanız gerektiğinde kullanın true.
RestingRobot

Yanıtlar:


222

İlk olarak, gerçekler:

if (booleanValue)

Tatmin edecek ifherhangi truthy değeri için açıklama booleanValuedahil true, herhangi bir sıfır olmayan sayı, herhangi boş olmayan bir dize değeri, herhangi bir nesne veya dizi referans, vb ...

Diğer yandan:

if (booleanValue === true)

Bu sadece ifdurumu booleanValuetam olarak eşitse karşılar true. Başka hiçbir doğru değer onu tatmin etmeyecektir.

Öte yandan bunu yaparsanız:

if (someVar == true)

Daha sonra, Javascript'in yapacağı şey, türle trueeşleşecek şekilde coerce yazın someVarve ardından iki değişkeni karşılaştırmaktır. Muhtemelen bunun niyetinin olmayacağı birçok durum vardır. Bu nedenle, çoğu durumda kaçınmak istersiniz, ==çünkü Javascript'in aynı tür olmak için iki şeyi nasıl zorlayacağına dair oldukça uzun bir kurallar kümesi vardır ve tüm bu kuralları anlamazsanız ve JS yorumlayıcısının ne zaman yapabileceğini tahmin edemezseniz (çoğu JS geliştiricisinin yapamadığı) iki farklı tür göz önüne alındığında, büyük olasılıkla ==tamamen kaçınmak istersiniz .

Ne kadar kafa karıştırıcı olabileceğine bir örnek olarak:

var x;

x = 0;
console.log(x == true);   // false, as expected
console.log(x == false);  // true as expected

x = 1;
console.log(x == true);   // true, as expected
console.log(x == false);  // false as expected

x = 2;
console.log(x == true);   // false, ??
console.log(x == false);  // false 

Değer için 2, bunun 2doğru bir değer olduğunu düşünürsünüz, bu yüzden olumlu olarak karşılaştırır true, ancak tip zorlaması böyle olmaz. Onun dönüştürme böylece sol el değerinin türüne uyacak şekilde sağ değerini dönüştürmektedir truesayıya 1o kıyaslıyor yüzden 2 == 1büyük olasılıkla amaçlanan şey kesinlikle olmadığı.

Yani, alıcı sakının. ==Açıkça karşılaştıracağınız türleri ve olası tüm zorlama algoritmalarının nasıl çalıştığını bilmediğiniz sürece neredeyse tüm durumlarda kaçınmanız en iyisidir .


Bu, gerçekten beklenen değerlere booleanValueve kodun nasıl çalışmasını istediğinize bağlıdır . Önceden bunun yalnızca bir trueveya falsedeğerine sahip olacağını biliyorsanız, bunu açıkça

if (booleanValue === true)

sadece ekstra kod ve gereksiz ve

if (booleanValue)

daha kompakt ve tartışmasız daha temiz / daha iyidir.

Öte yandan, ne booleanValueolabileceğini bilmiyorsanız ve truebaşka otomatik tür dönüşümü olmadan gerçekten ayarlanıp ayarlanmadığını test etmek istiyorsanız , o zaman

if (booleanValue === true)

sadece iyi bir fikir değil, aynı zamanda gerekli.


Örneğin, .on()jQuery uygulamasına bakarsanız, isteğe bağlı bir dönüş değeri vardır. Geri arama geri dönerse false, jQuery olayın yayılmasını otomatik olarak durdurur. Bu özel durumda, jQuery SADECE falsedöndürüldüğünde yayılımı durdurmak istediğinden, karşılaştırmayı sağlamak için === falseistemedikleri undefinedveya 0veya ""veya otomatik olarak false değerine dönüştürecek başka bir şey için dönüş değeri açıklığını kontrol ederler .

Örneğin, geri arama kodunu işleyen jQuery olayı aşağıdadır:

ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );

if ( ret !== undefined ) {
     event.result = ret;
     if ( ret === false ) {
         event.preventDefault();
         event.stopPropagation();
     }
 }

JQuery'nin açıkça aradığını görebilirsiniz ret === false.

Ancak, jQuery kodunda, kodun isteği göz önüne alındığında daha basit bir kontrolün uygun olduğu birçok yer de vardır. Örneğin:

// The DOM ready check for Internet Explorer
function doScrollCheck() {
    if ( jQuery.isReady ) {
        return;
    }
    ...

Bu soruyu bir süredir düşünüyorum, ama soracak birini bulma şansım olmadı. Bir göz atabilirseniz sevinirim. stackoverflow.com/questions/32615466/…
mmm

Bu cevap tamamen doğru değil. 'x == true' sıfır olmayan sayılar için geçerli olmaz.
Teemoh

@Teemoh - Yorumunu anlamıyorum. Bkz. Jsfiddle.net/jfriend00/89h8d8tm .
jfriend00

1
Sadece 'if (x)' ifadesinin, cevabınızın ilk paragrafında yazdığınız gibi 'if (x == true)' ile aynı olmadığını söylemek istiyorum. 'if (x)' açıkça 'x' i boole temsiline dönüştürür. 'if (x == true)' EcmaScript Özet Karşılaştırma Algoritmasını kullanır. 'İf (x == true)' ifadesinin sıfır olmayan herhangi bir sayı veya boş olmayan dize veya herhangi bir nesne için doğru olacağını yazdınız. Bu sadece yanlış. Örneğinizi 1 yerine 2 ile çalıştırırsam çalışmaz.
Teemoh

2
@Teemoh - Ne demek istediğini anlıyorum. Cevap düzeltildi ve netleştirildi ve beklenmedik şeyleri nasıl yapabileceğini gösteren bir örnekle birlikte tip zorlaması üzerine bir bölüm ekledim.
jfriend00

40

Eğer yazarsanız:, if(x === true)Sadece x = true için geçerli olacaktır

: Yazarsanız , şu olmayan if(x)herhangi bir x için doğru olur : '' (boş dize), yanlış, null, tanımsız, 0, NaN.


(boş dize), yanlış, boş, tanımsız, 0, NaN
Oliboy50

Unutma NaNve -0.
haykam

8

"İf" düzünde değişken bir Boolean öğesine zorlanır ve nesnede toBoolean kullanır: -

    Argument Type   Result

    Undefined       false
    Null            false
    Boolean         The result equals the input argument (no conversion).
    Number          The result is false if the argument is +0, 0, or NaN;
                    otherwise the result is true.
    String          The result is false if the argument is the empty 
                    String (its length is zero); otherwise the result is true.
    Object          true.

Ancak === ile karşılaştırmanın herhangi bir tür zorlaması yoktur, bu yüzden zorlama olmadan eşit olmalıdırlar.

Nesnenin bir Boolean bile olmadığını söylüyorsanız, true / false'dan daha fazlasını düşünmeniz gerekebilir.

if(x===true){
...
} else if(x===false){
....
} else {
....
}

5

Kullanıcınıza bağlıdır. Türü de kontrol etmek mantıklı olabilir, ancak sadece bir bayraksa, yapmaz.


===Karşılaştırma tipi zorlama yapmaz. Böylece OP kodu etkin bir şekilde bayrağın türünü test eder. Yalnızca değer bir boolean ve true olduğunda başarılı olur.
Jesse Hallett

Yeniden ifade edeyim. Bunun doğru ya da yanlış olacağını biliyorsanız, önemli değil.
Ven

5

Genel olarak, atlamak daha temiz ve basittir === true.

Ancak Javascript'te bu ifadeler farklıdır.

if (booleanValue)eğer çalıştırır booleanValueolduğunu truthy - başka bir şey 0, false, '', NaN, null, ve undefined.

if (booleanValue === true)yalnızca booleanValuetam olarak eşit olduğunda yürütülür true.


Sadece boolValue'nun doğru veya yanlış olmasını istesem bile, emin olmak istediğim şey budur. Değişken, kodda birden çok kez true / false olarak ayarlanır. Ben kodu yazarken biliyorum, ama bir yıl sonra tekrar kodu kontrol ederseniz ben her şeyi doğru yeniden okumak sürece o sadece büyük bir soru işareti?
DirkZz

@aldanux: Hata! Demek istedim ''.
SLaks

4

Kimlik (===)operatörü, (==)tip dönüştürme yapılmaması dışında eşitlik operatörüne aynı şekilde davranır ve türlerin eşit kabul edilmesi için aynı olması gerekir.


Son cümleniz yanlış. İki ifadenizi if (booleanValue)ve if (booleanValue==true)ne zaman booleanValueolduğunu deneyin 2. Bu iki ifade size aynı sonucu vermez.
jfriend00

İlginç. Bunun için sözünü alacağım. JS'de ObjC / C / C ++ dünyasında düşünüyordum, JS'deki veri türleri değiştirilebildiğinden ve 2 == true ise o zaman ölçülmeyeceğinden, doğru olduğunu varsayıyorum.
Apollo YAZILIMI

1
Bu özel örnek için yukarıdaki cevabıma bakın. Farklı tipteki iki değeri karşılaştırmak için Javascript'in otomatik tip dönüşümü nasıl yaptığı ile ilgilidir.
jfriend00

3

Kontrol Booleanedilen değer daha az kodlama için doğrudan kullanılması tercih edildiğinden ve aynı==true


2

Zaten bool olarak açıkça başlattığınızdan, ===operatörün gerekli olmadığını düşünüyorum .


2

Değişken yalnızca boole değerlerini alabilirse, daha kısa sözdizimini kullanmak mantıklıdır.

Potansiyel olarak başka tipler atanabilirse ve veya ' truedan ayırmanız gerekiyorsa, kullanmanız gerekir .1"foo"=== true


2

Bence akıl yürütmenin sağlam. Ancak pratikte ===karşılaştırmayı atlamanın çok daha yaygın olduğunu gördüm . Bunun üç nedeni olduğunu düşünüyorum:

  1. Genellikle ifadenin anlamına katkıda bulunmaz - bu, değerin yine de boole olduğu bilinen durumlarda.
  2. JavaScript'te çok fazla tür belirsizliği olduğundan, tür denetimini zorlamak, beklenmedik undefinedveya nulldeğer elde ettiğinizde sizi ısırmaya meyillidir . Genellikle bu gibi durumlarda testinizin başarısız olmasını istersiniz. (Gerçi bu görüşü "hızlı başarısız" sloganıyla dengelemeye çalışıyorum).
  3. JavaScript programcıları, özellikle boole ifadelerinde, türlerle hızlı ve gevşek oynamayı sever, çünkü yapabiliriz.

Bu örneği düşünün:

var someString = getInput();
var normalized = someString && trim(someString);  
// trim() removes leading and trailing whitespace

if (normalized) {
    submitInput(normalized);
}

Bu tür bir kodun nadir olmadığını düşünüyorum. Bu davalarına bakan getInput()döner undefined, nullveya boş bir dize. İki boole değerlendirmesi nedeniyle submitInput(), yalnızca belirtilen girdi boşluk olmayan karakterler içeren bir dize ise çağrılır.

JavaScript'te &&, falsy ise ilk argümanını veya ilk argüman doğruysa ikinci argümanını döndürür; böylece normalizedolacak undefinedeğer someStringbenzeri tanımsız edildi ve. Bu, yukarıdaki boole ifadelerine yapılan girdilerin hiçbirinin gerçekte boolean değerler olmadığı anlamına gelir.

Bunun gibi kodları gördüğünüzde, güçlü bir tür denetleme kıskacına alışkın olan birçok programcının olduğunu biliyorum. Ancak, güçlü yazmanın uygulanmasının , kodu karmaşıklaştıracak açık denetimler nullveya undefineddeğerler gerektirdiğini unutmayın . JavaScript gerekli değildir.


1

Bu bağlıdır. Değişkeninizin DOĞRU olarak çözülen bir şey olabileceğinden endişe ediyorsanız. O zaman sert kontrol şarttır. Aksi takdirde size kalmış. Ancak, sözdiziminin whatever == TRUEne yaptığını bilenleri şaşırtacağından şüpheliyim .


1

Javascript'te boolean fikri oldukça belirsizdir. Bunu düşün:

 var bool = 0 
 if(bool){..} //evaluates to false

 if(//uninitialized var) //evaluates to false

Bu nedenle, bir if ifadesi (veya başka bir kontrol ifadesi) kullanırken, bir "boolean" türü var. Bu nedenle, bence, ifadenizin "=== true" kısmı bir boolean olduğunu biliyorsanız gereksizdir, ancak değeriniz belirsiz bir "doğruluk" var ise kesinlikle gereklidir. Javscript'teki booleans hakkında daha fazla bilgiyi burada bulabilirsiniz .



1

Ayrıca, bir nesneyi test etmeniz gerekiyorsa, Boolean nesnesiyle de test edilebilir error={Boolean(errors.email)}

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.