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?


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.


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!


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.