Birçok cevap işin yarısını yapıyor. Evet, !!X
"X'in bir boolean olarak temsil edilen gerçeği" olarak okunabilir. Ancak !!
, pratik olarak konuşursak, tek bir değişkenin doğru mu yoksa yanlış mı olduğunu anlamak için o kadar önemli değildir. !!myVar === true
sadece aynı myVar
. !!X
"Gerçek" bir boole ile karşılaştırmak gerçekten yararlı değildir.
Hangi konuda kazanç !!
birden değişkenlerin truthiness kontrol yeteneği birbirlerine karşı bir standardize, tekrarlanabilir (ve JSLint dostu) moda.
Basitçe döküm :(
Yani...
0 === false
olduğunu false
.
!!0 === false
olduğunu true
.
Yukarıdakiler o kadar kullanışlı değil. if (!0)
ile aynı sonuçları verir if (!!0 === false)
. Bir değişkeni boole'ye dönüştürmek ve sonra "gerçek" bir boole ile karşılaştırmak için iyi bir durum düşünemiyorum.
JSLint'in yönergelerinden "== ve! =" İfadesine bakın (not: Crockford sitesini biraz hareket ettiriyor; bu bağlantı bir noktada ölmekle yükümlüdür) neden biraz:
== ve! = Operatörleri karşılaştırma yapmadan önce baskı yaparlar. Bu kötüdür, çünkü '\ t \ r \ n' == 0 doğru olur. Bu tür hataları maskeleyebilir. JSLint == öğesinin doğru kullanılıp kullanılmadığını güvenilir bir şekilde belirleyemediğinden, == ve! = Kullanmamak ve bunun yerine her zaman daha güvenilir === ve! == işleçlerini kullanmak en iyisidir.
Yalnızca bir değerin gerçek veya sahte olduğunu düşünüyorsanız, kısa formu kullanın. Onun yerine
(foo != 0)
sadece söyle
(foo)
ve yerine
(foo == 0)
söyle
(!foo)
Not bazı olduğumuzu unintuitive vakalar bir boolean bir sayıya atılacaktır ( true
artığını 1
ve false
karşı 0
birtakım etmek için bir boole karşılaştırırken). Bu durumda, !!
zihinsel olarak yararlı olabilir. Yine de, bunlar, bir boolean olmayanı, sert tipli bir boole ile karşılaştırdığınız, imo, ciddi bir hatadır. if (-1)
hala buraya gitmenin yolu.
╔═══════════════════════════════════════╦═══════════════════╦═══════════╗
║ Original ║ Equivalent ║ Result ║
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (-1 == true) console.log("spam") ║ if (-1 == 1) ║ undefined ║
║ if (-1 == false) console.log("spam") ║ if (-1 == 0) ║ undefined ║
║ Order doesn't matter... ║ ║ ║
║ if (true == -1) console.log("spam") ║ if (1 == -1) ║ undefined ║
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (!!-1 == true) console.log("spam") ║ if (true == true) ║ spam ║ better
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (-1) console.log("spam") ║ if (truthy) ║ spam ║ still best
╚═══════════════════════════════════════╩═══════════════════╩═══════════╝
Ve motorunuza bağlı olarak işler daha da delinir. Örneğin WScript ödülü kazanır.
function test()
{
return (1 === 1);
}
WScript.echo(test());
Bazı tarihsel Windows jive nedeniyle , bu bir mesaj kutusuna -1 çıktı! Bir cmd.exe isteminde deneyin ve görün! Ancak WScript.echo(-1 == test())
yine de size 0 veya WScript verir false
. Gözlerini başka yöne çevirmek. İğrenç.
Doğruluk karşılaştırması :)
Peki ya eşit doğruluk / yanlışlık için kontrol etmem gereken iki değerim varsa?
Varmış gibi davran myVar1 = 0;
ve myVar2 = undefined;
.
myVar1 === myVar2
açıktır 0 === undefined
ve yanlıştır.
!!myVar1 === !!myVar2
olduğu !!0 === !!undefined
ve doğrudur! Aynı doğruluk! (Bu durumda, her ikisi de "bir sahtelik gerçeğine sahiptir".)
Yani gerçekten "boolean-cast değişkenleri" kullanmanız gereken tek yer, her iki değişkenin de aynı gerçekliğe sahip olup olmadığını kontrol ettiğiniz bir durum olsaydı, değil mi? Yani, kullanım !!
iki vars olup olmadığını görmek için gerekirse truthy veya her ikisi falsy hem , (veya değil), eşit (veya değil) doğruluğuna .
Bunun için hazırlıksız, harika bir kullanım örneği düşünemiyorum. Belki bir formda "bağlantılı" alanlarınız var?
if (!!customerInput.spouseName !== !!customerInput.spouseAge ) {
errorObjects.spouse = "Please either enter a valid name AND age "
+ "for your spouse or leave all spouse fields blank.";
}
Demek artık ikisi için de bir truthy varsa veya eş adı ve yaşı ikisi için de bir falsy, devam edebilir. Aksi takdirde, yalnızca bir değere sahip bir alanınız (veya çok erken düzenlenmiş bir evlilik) vardır ve errorObjects
koleksiyonunuzda fazladan bir hata oluşturmanız gerekir .
EDIT 24 Eki 2017, 6 Şub 19:
Açık Boole değerleri bekleyen 3. taraf kütüphaneler
İşte ilginç bir durum ... !!
3. taraf kütüphaneleri açık Boole değerleri beklediğinde yararlı olabilir.
Örneğin, JSX'teki False (React), basit sahtecilikle tetiklenmeyen özel bir anlama sahiptir. JSX'inizde aşağıdaki gibi bir şey döndürmeyi denediyseniz, bir int bekliyoruz messageCount
...
{messageCount && <div>You have messages!</div>}
... 0
sıfır mesajınız olduğunda React'in oluşturulmasını gördüğünüzde şaşırabilirsiniz . JSX'in görüntülenmemesi için açıkça false döndürmeniz gerekir. Yukarıdaki ifade 0
, JSX'in gerektiği gibi oluşturduğu döndürür . Sahip olmadığınızı söyleyemez Count: {messageCount && <div>Get your count to zero!</div>}
(ya da daha az çelişkili bir şey).
Bir düzeltme coerces BangBang, içerir 0
içine !!0
olan false
:
{!!messageCount && <div>You have messages!</div>}
JSX dokümanları, daha açık olmanızı, kendi yorum kodunuzu yazmanızı ve bir Boole için zorlamak üzere bir karşılaştırma kullanmanızı önerir.
{messageCount > 0 && <div>You have messages!</div>}
Üçlü ile kendimde daha rahat davranıyorum -
{messageCount ? <div>You have messages!</div> : false}
Typescript'te aynı anlaşma: Bir boole döndüren bir fonksiyonunuz varsa (veya bir boolean değişkenine değer atarsanız), [genellikle] bir boolean-y değeri döndüremez / atayamazsınız; kuvvetle yazılmış bir boole olmalıdır. Bu, iff'nin myObject
güçlü bir şekilde yazıldığı , return !myObject;
bir boole döndüren bir işlev için çalıştığı, ancak return myObject;
olmadığı anlamına gelir. Sen zorunda return !!myObject
typescript beklentilerini eşleşecek.
Patlama için istisna? Eğer myObject
bir oldu any
, geri JavaScript'in Vahşi Batı'da konum ve olmadan iade edebilirsiniz !!
dönüş tipi bir boolean olsa bile.
Bunların JavaScript'e özgü olmayan JSX ve Dizgi metinleri kuralları olduğunu unutmayın .
Ancak 0
, işlenmiş JSX'inizde garip s görürseniz, gevşek falsy yönetimini düşünün.