Was bedeutet das "|" (Single Pipe) in JavaScript tun?

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

Warum wird 0.5 | 0Null zurückgegeben, aber jede Ganzzahl (einschließlich Negativ) gibt die Eingabe-Ganzzahl zurück? Was macht das Einzelrohr ("|")?

Matrym
quelle
12
Es verhindert hilfreich, dass Syntaxfehler Sie auf die Tatsache aufmerksam machen, dass Sie | eingegeben haben anstelle von ||
Andrew Myers

Antworten:

157

Dies ist ein bisschen oder .
Da bitweise Operationen nur für ganze Zahlen sinnvoll sind, 0.5wird sie abgeschnitten.

0 | xist xfür jeden x.

SLaks
quelle
8
Das ist eine gute Möglichkeit, Gleitkommazahlen in int umzuwandeln oder zu verwendenparseInt()
MaBi
4
@MaBi: Sie sollten jedoch wissen, dass der Wert in eine 32-Bit-Ganzzahl konvertiert wird, sodass er bei größeren Zahlen nicht ordnungsgemäß funktioniert.
Guffa
1
Kann man also davon ausgehen, dass es sich um eine Bodenfunktion handelt?
13. Mai
2
Verwenden Sie dies nur für bitweise oder. Wie @Guffa sagte, verhalten sich große Zahlen nicht wie erwartet. Beispiel: 248004937500 | 0 = -1103165668
Joseph Connolly
Große Zahlen laufen über, weil sie in 32-Bit-Int konvertiert werden.
Slikts
151

Der Bitvergleich ist so einfach, dass er fast unverständlich ist;) Schauen Sie sich dieses "Nybble" an

   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)

Durch bitweises ODER 6 und 10 erhalten Sie 14:

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

Schrecklich verwirrend!

Trey
quelle
16
Funktioniert auch für Boolean. JS interpretiert true als 1, false als 0; soalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
Gordon
21

Ein einzelnes Rohr ist ein bitweises ODER .

Führt die ODER-Verknüpfung für jedes Bitpaar aus. a ODER b ergibt 1, wenn entweder a oder b 1 ist.

JavaScript schneidet alle nicht ganzzahligen Zahlen in bitweisen Operationen ab, daher wird es als 0|00 berechnet .

Yahel
quelle
6
Dies beantwortet die Frage nicht. ("Warum gibt dies 0 zurück")
Kirk Woll
8

Dieses Beispiel wird Ihnen helfen.

 
    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);

Nikhil Mahirrao
quelle