2014-12-20 12 views
5

Ho scoperto che gli operatori bit a bit sui bool non restituiscono bool in JavaScript. Ho pensato che dovesse essere un bug, ma l'ho cercato nelle specifiche ECMAScript, e sicuramente, dice che gli operatori bit a bit restituiscono numeri, non bool. Non dice una parola sulla stranezza che risulta quando le stai usando su valori booleani. Perché è fatto in questo modo? Ho usato questa tecnica per anni in altre lingue, quindi sono totalmente sconcertato perché fa qualcosa di diverso in JavaScript. Qualche idea? È solo perché nessuno usa mai operatori bit a bit in questo modo (tranne me), o c'è una ragione tecnica? Non riesco a immaginare che sarebbe difficile controllare il tipo e restituire un booleano.JavaScript: perché l'OR bit a bit dei booleani restituisce un numero anziché un valore booleano?

Per riferimento, il codice seguente:

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

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

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

produce il seguente output:

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

Edit:

Su richiesta, ho usato questo in C, C++, e sono abbastanza sicuro di PHP, anche se non lo giurerei. Sì, mi rendo conto che C/C++ è stato digitato, quindi sarebbe diverso internamente. Mi sto solo chiedendo perché JavaScript si comporterebbe diversamente.

Su richiesta, un esempio di come avrei utilizzano in genere | =

var foundLowest = false; 

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

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

maggio si aggiungere un po 'esempio di un caso d'uso reale del '|' o 'e' su valori booleani? –

+0

Del resto, che lingua stai dicendo supporta '| =' con i booleani? –

+0

Immagino che operazioni bit a bit restituiscano sempre valori numerici, anche per i booleani; considerando che sotto il cofano si identificano con i numeri stessi. Perché dovresti aspettarti un valore di ritorno booleano? –

risposta

6

Avere gli operatori bit per bit si comportano in modo coerente (sempre convertire i loro operandi in numeri) sembra una sufficientemente buona ragione per loro di specificare la come sono Qualche anno fa si è parlato dell'aggiunta di ||= e di simili operatori di stenografia, ma Eich   &   Co sono molto prudenti nell'aggiungere cose del genere e mi sembra di ricordare un commento sulla falsariga di "didn" t tirare il suo peso sintattico. " :-)

noti che perché JavaScript è felice di costringere alcun valore a un valore booleano, si può tranquillamente utilizzare il vostro stile attuale e lo hanno ancora lavorare, perché costringe a true1 che costringe a true, e false costringe a 0 che obbliga a false. Es .:

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, si, sono solo paranoico sulla coercizione di tipo. Uso gli operatori di uguaglianza/disuguaglianza di tipo sicuro, e ho jshint mi tormentano quando dimentico. Immagino di essere impiccato da C/C++.Soprattutto il C++, con una miriade di modi diversi in cui le conversioni implicite con i costruttori possono metterti nei guai. – GreatBigBore

+1

@GreatBigBore: la coercizione di tipo può effettivamente essere complicata, ma il sottoinsieme di verità/falsità è abbastanza semplice: i valori di falsi sono '0',' NaN', '" "', 'null',' indefinito', e di naturalmente, 'false'; tutto il resto è vero. –

Problemi correlati