2012-02-14 30 views
138

Olası Çoğalt:
What is the !! (not not) operator in JavaScript?
What does the !! operator (double exclamation point) mean in JavaScript?Çift ünlem işareti?

Yani

Bazı kod debuging ve bu karşılaştım edildi:

var foo.bar = 0; // this is actually passed from another function, adding it for context 

function(foo) 
    var someVar = !!foo.bar; 
    if(foo.bar){ 
     // ..stuff happens 
    } 
    else{ 
     // .. something else happens 
    } 
} 

Tamam sorularımı noktası budur !!? Tek yapman gereken 0 === false.

  1. boolean(foo.bar) kıyasla bu kullanmanın bir yararı var mı?

  2. foo.bar halihazırda 0 === false olduğu için bir değerlendirmeyle değerlendirilebilir, bu nedenle neden dönüşümden geçebilirsiniz?

+2

10 Ne olduğunu biliyorum Sadece bağlantılı sorunuzda açıklanmayan fayda nedir bilmek istiyorum. – jpalladino84

+0

'0 == üç eşittir FALSE olmayan' 0 === döküm örtülü bir girişimi önler FALSE. – Andrew

cevap

229

Bu bir mantıksal bir değer dönüştürür ve bir boolean türü sağlar (SomeVar başka bir yerde yeniden değildir).

"foo"  = "foo" 
!"foo"  = false 
!!"foo" = true 

foo.bar geçirilir, o zaman 0 ancak diğer bazı falsy değer olmayabilir. JavaScript

''  == '0'   // false 
0   == ''   // true 
0   == '0'   // true 
false  == 'false'  // false 
false  == '0'   // true 
false  == undefined  // false 
false  == null   // false 
null  == undefined  // true 
" \t\r\n" == 0    // true 

Kaynak için

Gerçek Tablo: Aşağıdaki doğruluk tablosuna bakın

NaN değerlerine gelince JavaScript da gerçekten garip alır Doug Crockford

. Ve bu benim kafamın üstünden düşünebildiğim tek durumdur! farklı şekilde davranır ===.

NaN === NaN  //false 
!!NaN === !!NaN //true 

// !!NaN is false 
+6

Bu soruya cevap vermiyor. Sorusu sorar: "foo.bar, eğer zaten 0 olduğu gibi yanlış değerlendirilebilir, yani neden dönüşümden geçtiniz?" Cevabınız, * bir Boole tipi sağladığını açıklar, ancak OP zaten biliyordu; soru şu ki, bir Boole türünün sağlanmasının * noktası * nedir? – ruakh

+0

@ruakh If ifadesi dolaylı ve kullanılmaz === – Gazler

+0

Üzgünüz, son yorumunuzu biraz detaylandırır mısınız? Çünkü aslında ne yapmaya çalıştığını anlamıyorum. : -/ – ruakh

4

Yukarıda belirtildiği gibi, bir nesneyi bir boole tipi ile zorlar. Sen kendiniz görebilirsiniz: basitçe karşılaştırmaları yapıyorsanız

(function typecheck() { 
    var a = "a"; 
    var b = !a; 
    var c = !!a; 

    alert("var a = " + typeof(a) + "\n" + 
     "var b = " + typeof(b) + "\n" + 
     "var c = " + typeof(c)); 
})(); 

, dönüşüm sadece sizin için daha sonra bir tür zorlama kaydeder.

Bilginize, aşağıdaki değerler JavaScript YANLIŞ zorlandığı alanları:

  • yanlış
  • ""
  • boş
  • tanımsız
+0

Yaparsam Ne demek 'YANLIŞ coerced': 'var b = (nullthing) gibi bir şey? 'mut': 'mutlu', eğer nullthing 0, null, undefined boş veya false ise güvenilir bir şekilde b = 'mutlu' alabilirim? Yemin edebilirim ki, bu tür durumlarda undefined veya null olduğu konusunda şikayette bulundum. – PixMach

+0

Karşılaştırma kuralları biraz garip. [İşte derinlemesine bir açıklama] (http://www.sitepoint.com/javascript-truthy-falsy/). Verdiğiniz örnekte, bir referans hatası alacağınız konusunda haklısınız. –

10

cevabı düşünmek Gerçekten çok fazla bir nokta yok.

  • belki fonksiyonun önceki bir sürümü birden fazla yerde someVar kullanılan veya gerçekten true veya false sahip yararlanmıştır yollarla, bu nedenle bu daha mantıklı: Biz nasıl ortaya çıktığını hakkında spekülasyon yapılabilir.
  • belki de bu işlevi yazan kişi !!'u true/false'a dönüştürmek için kullanılır.
  • belki de bu işlevi yazan kişi, her hesaplamanın (bu durumda, Boole dönüşümünün) sonuca bir değişken atayarak anlamlı bir ad verilmesi gerektiğini hisseder.
  • Belki de, JavaScript'te Boolean dönüşümü şaşırtıcı bir şekilde hataya eğilimli olduğundan (örneğin, new Boolean(false) gerçek değerli bir değerdir), işlevi yazan kişi, efektte olsa bile, her zaman açıkça örtük olarak değil — yerine açıkça yapılması gerektiğini hisseder Sadece — aynı potansiyel hata noktası olarak dikkat çekmek için aynıdır.
    • Bu, elbette, işlevi yazan kişinin "açık" bir Boole dönüşümü olarak !! olduğunu düşünür. Teknik olarak — değil, if — aynı örtülü Boole dönüşüm kullanır, ancak bu deyim için kullanılırsa, o zaman açık bir dönüşüm için tutar.

ama benim sübjektif görüş, bu nedenlerden hiçbiri çok iyi biridir!

+0

Bu özellikle ilgili ve bu cevabı tercih etmemi sağlıyor; "(örneğin, yeni Boole (yanlış), gerçek değerli bir değerdir)," –

İlgili konular