2014-12-20 21 views
5

Boole'lardaki bitsel işleçlerin, JavaScript'te boole döndürmediği zor yolu öğrendim. Bunun bir hata olması gerektiğini düşündüm, ama ECMAScript'inde bunu inceledim ve eminim ki, bitlik operatörler boole değil, sayıları döndürüyorlar. Boolean değerlerinde kullandığınızda ortaya çıkan gariplik hakkında bir şey söylemez. Neden bu şekilde yapılır? Bu tekniği yıllarca başka dillerde kullandım, bu yüzden JavaScript’de neden farklı bir şey yaptığını tamamen şaşırdım. Herhangi bir fikir? Bu, hiç kimsenin bu şekilde bitly operatörleri kullanmadığı mı (hariç) yoksa teknik bir neden var mı? Türü kontrol edip bir boole döndürmenin zor olacağını hayal edemiyorum.JavaScript: neden booleanların bitwise VEYA boolean yerine bir sayı döndürüyor?

referans, aşağıdaki kod:

var found = false; 
console.log(found, typeof(found)); 

found |= true; 
console.log(found, typeof(found)); 

found = true; 
console.log(found, typeof(found)); 

aşağıdaki çıktı üretir:

false 'boolean' 
1 'number' 
true 'boolean' 

Düzenleme:

isteğe göre, bir C kullanmışlardır, C++, ve eminim ki PHP, bunun üzerine küfür etmesem de. Evet, C/C++ 'un yazıldığını biliyorum, bu yüzden dahili olarak farklı olurdu. Sadece JavaScript'in neden farklı davranacağını merak ediyorum. Talep üzerine

, ben genellikle kullanmak bir örnek | belirtilmesine için bitsel operatörleri (her zaman sayılara onların işlenen dönüştürmek) sürekli davranmaya Having =

var foundLowest = false; 

for(var k = 0; k < someLength; ++k) { 
    foundLowest |= someFunctionThatReturnsTF(k); 
} 

if(foundLowest === true) { 
    /* do stuff */ 
} 
+1

Eğer' gerçek bir kullanım durumunda bazı örnek ekleyebilir miyim? –

+0

Bu konuda, söylediğin hangi dilde booleanlarla '| =' destekliyor? –

+0

Booleanlar için bile, sayısal değerleri her zaman döndürmek için bitsel işlemleri düşünürdüm; kaput altında düşünürsek, sayısal olarak kendilerini eşitler. Neden bir boole dönüş değeri beklerdiniz? –

cevap

6

yeterince iyi bir neden gibi görünüyor oldukları gibi. Birkaç yıl önce, ||= ve benzer kısa yollu operatörlerin eklenmesiyle ilgili es-tartışma listesinden bahsedildi, ancak Eich   &   Co, bu tür şeyler eklemek konusunda oldukça muhafazakar ve "didn" satırları boyunca bir yorum hatırlıyorum gibi görünüyor t sözdizimsel ağırlığını çek. :-) JavaScript bir mantıksal değere herhangi bir değeri zorlamak için mutlu olduğunu, çünkü mutlu mevcut stili kullanabilir ve truetrue için zorlar 1 için zorlar çünkü hala işe sahiptir ve false o

Not 0 için zorlar ki false için zorlar. boole değerleri üzerinde `veya` & `| Örn .:

var a = false; 
 

 
a |= true; 
 
// Even though `a` is now `1`, it works just fine 
 
if (a) { 
 
    snippet.log(a + " => if branch"); // Does this one 
 
} else { 
 
    snippet.log(a + " => else branch"); 
 
} 
 

 
a &= false; 
 
// Even though `a` is now `0`, it works just fine 
 
if (a) { 
 
    snippet.log(a + " => if branch"); 
 
} else { 
 
    snippet.log(a + " => else branch"); // Does this one 
 
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

Hehe, evet, sadece tip baskısı hakkında paranoyak. Ben tür güvenli eşitlik/eşitsizlik operatörleri kullanıyorum ve unuttuğumda bana jshint nag var. Sanırım C/C++ 'dan asılmışım.Özellikle C++, yapıcılarla örtülü dönüşümler yapabileceğiniz zillion farklı yollarla sizi belaya sokabilir. – GreatBigBore

+1

@GreatBigBore: Tip baskısı gerçekten de zor olabilir, ancak bunun gerçek/falsey alt kümesi oldukça basittir: Falsey değerleri "0", "NaN", "" "," null "," undefined "ve ders, yanlış '; her şey gerçektir. –