O que faz o "|" (tubo único) fazer em JavaScript?

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

Por que 0.5 | 0retornar zero, mas qualquer número inteiro (incluindo negativo) retorna o número inteiro de entrada? O que o tubo único ("|") faz?

Matrym
fonte
12
É útil evitar que erros de sintaxe o alertem para o fato de que você digitou | em vez de ||
Andrew Myers

Respostas:

157

Este é um bit a bit ou .
Como as operações bit a bit só fazem sentido em números inteiros, 0.5é truncado.

0 | xé x, para qualquer x.

SLaks
fonte
8
isso é uma boa maneira de converter o número de ponto flutuante para int ou usoparseInt()
Mabi
4
@MaBi: No entanto, você deve saber que o valor é convertido em um número inteiro de 32 bits, para que não funcione corretamente para números maiores.
Guffa
1
Então, pode ser considerado o mesmo que a função Floor?
May13ank
2
Use isso apenas para bit a bit ou. Como disse @Guffa, grandes números não se comportarão conforme o esperado. Ex: 248004937500 | 0 = -1103165668
Joseph Connolly
Números grandes transbordam porque são convertidos em int de 32 bits.
slikts
151

A comparação de bits é tão simples que é quase incompreensível;) Confira este "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)

ORing bit a bit 6 e 10 fornecerá 14:

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

Terrivelmente confuso!

Trey
fonte
16
Funciona para booleano também. JS interpreta verdadeiro como 1, falso como 0; entãoalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
Gordon
21

Um único pipe é um OR bit a bit .

Executa a operação OR em cada par de bits. a OR b produz 1 se a ou b é 1.

O JavaScript trunca qualquer número não inteiro em operações bit a bit, então é calculado como 0|0, que é 0.

Yahel
fonte
6
Isso não responde à pergunta. ("Por que isso retorna 0")
Kirk Woll
8

Este exemplo irá ajudá-lo.

 
    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
fonte