Cosa significa "|" (single pipe) fare in JavaScript?


148
console.log(0.5 | 0); // 0
console.log(-1 | 0);  // -1
console.log(1 | 0);   // 1

Perché 0.5 | 0restituisce zero, ma qualsiasi numero intero (incluso negativo) restituisce il numero intero di input? Cosa fa la singola pipe ("|")?


12
Previene utilmente gli errori di sintassi che ti avvisano del fatto che hai digitato | anziché ||
Andrew Myers,

Risposte:


157

Questo è un bit per bit o .
Poiché le operazioni bit a bit hanno senso solo sugli interi, 0.5viene troncata.

0 | xè x, per nessuno x.


9
è un bel modo per convertire un numero in virgola mobile in int o usareparseInt()
MaBi

5
@MaBi: dovresti comunque sapere che il valore viene convertito in un numero intero a 32 bit, quindi non funzionerà correttamente per numeri più grandi.
Guffa,

1
Quindi può essere considerato uguale alla funzione Floor?
Maggio 13,

2
Usa questo solo per bit per bit o. Come ha detto @Guffa, i numeri grandi non si comporteranno come previsto. Es .: 248004937500 | 0 = -1103165668
Joseph Connolly

I numeri grandi traboccano perché vengono convertiti in int a 32 bit.
Scorri

151

Il confronto dei bit è così semplice che è quasi incomprensibile;) Dai un'occhiata a questo "nybble"

   8 4 2 1
   -------
   0 1 1 0 = 6  (4 + 2)
   1 0 1 0 = 10 (8 + 2)
   =======
   1 1 1 0 = 14 (8 + 4 + 2)

OR bit bit 6 e 10 ti darà 14:

   alert(6 | 10); // should show 14

Terribilmente confuso!


16
Funziona anche per i booleani. JS interpreta vero come 1, falso come 0; cosìalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
Gordon,

21

Una singola pipe è un OR bit-saggio .

Esegue l'operazione OR su ciascuna coppia di bit. a OR b produce 1 se aob è 1.

JavaScript tronca qualsiasi numero non intero in operazioni bit a bit, quindi viene calcolato come 0|0, che è 0.


6
Questo non risponde alla domanda. ("Perché questo restituisce 0")
Kirk Woll l'

8

Questo esempio ti aiuterà.

 
    var testPipe = function(input) { 
       console.log('input => ' + input);
       console.log('single pipe | => ' + (input | 'fallback'));
       console.log('double pipe || => ' + (input || 'fallback'));
       console.log('-------------------------');
    };

    testPipe();
    testPipe('something'); 
    testPipe(50);
    testPipe(0);
    testPipe(-1);
    testPipe(true);
    testPipe(false);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.