Co oznacza „|” (pojedyncza potok) czy w JavaScript?

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

Dlaczego 0.5 | 0zwraca zero, ale każda liczba całkowita (w tym ujemna) zwraca wejściową liczbę całkowitą? Co robi pojedyncza kreska („|”)?

Matrym
źródło
12
Pomaga zapobiega błędom składni ostrzegającym o wpisaniu | zamiast ||
Andrew Myers

Odpowiedzi:

157

To jest bitowe lub .
Ponieważ operacje bitowe mają sens tylko na liczbach całkowitych, 0.5jest obcięty.

0 | xjest xdla każdego x.

SLaks
źródło
9
to parseInt()
dobry
5
@MaBi: Powinieneś jednak wiedzieć, że wartość jest konwertowana na 32-bitową liczbę całkowitą, więc nie będzie działać poprawnie dla większych liczb.
Guffa
1
Czy można uznać, że jest to to samo, co funkcja podłogi?
maja,
2
Użyj tego tylko dla bitowych lub. Jak powiedział @Guffa, duże liczby nie będą zachowywać się zgodnie z oczekiwaniami. Np .: 248004937500 | 0 = -1103165668
Joseph Connolly
Duże liczby przepełnią się, ponieważ zostaną przekonwertowane na 32-bitowe int.
slipy
151

Porównanie bitów jest tak proste, że prawie niezrozumiałe;) Sprawdź to "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)

Bitowe ORing 6 i 10 daje 14:

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

Strasznie zagmatwane!

Trey
źródło
16
Działa również dla Boolean. JS interpretuje prawdę jako 1, fałsz jako 0; takalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
gordon
21

Pojedyncza rura jest bitowym OR .

Wykonuje operację OR na każdej parze bitów. a LUB b daje 1, jeśli a lub b wynosi 1.

JavaScript obcina wszystkie liczby nie będące liczbami całkowitymi w operacjach bitowych, więc jest obliczany jako 0|0, czyli 0.

Yahel
źródło
6
To nie odpowiada na pytanie. („Dlaczego to zwraca 0”)
Kirk Woll
8

Ten przykład ci pomoże.

 
    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
źródło