¿Qué significa el "|" (tubería única) hacer en JavaScript?

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

¿Por qué 0.5 | 0devuelve cero, pero cualquier entero (incluido negativo) devuelve el entero de entrada? ¿Qué hace la tubería única ("|")?

Matrym
fuente
12
Ayuda a evitar que los errores de sintaxis lo alerten sobre el hecho de que escribió | en lugar de ||
Andrew Myers

Respuestas:

157

Esto es un bit a bit o .
Como las operaciones bit a bit solo tienen sentido en enteros, 0.5se trunca.

0 | xes x, para cualquiera x.

SLaks
fuente
9
esa es una buena manera de convertir un número de coma flotante a int, o usarparseInt()
MaBi
55
@MaBi: Sin embargo, debe saber que el valor se convierte en un entero de 32 bits, por lo que no funcionará correctamente para números más grandes.
Guffa
1
Entonces, ¿puede considerarse igual que la función Floor?
May13ank
2
Use esto solo para bit a bit o. Como dijo @Guffa, grandes números no se comportarán como se esperaba. Ej: 248004937500 | 0 = -1103165668
Joseph Connolly
Los números grandes se desbordarán porque se convierten a 32 bits int.
slikts
151

La comparación de bits es tan simple que es casi incomprensible;) Mira 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)

Bitwise ORing 6 y 10 le dará 14:

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

¡Terriblemente confuso!

Trey
fuente
16
Funciona para booleano también. JS interpreta verdadero como 1, falso como 0; entoncesalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
gordon
21

Una sola tubería es un OR inteligente .

Realiza la operación OR en cada par de bits. a OR b produce 1 si a o b es 1.

JavaScript trunca cualquier número no entero en operaciones bit a bit, por lo que se calcula como 0|0, que es 0.

Yahel
fuente
66
Esto no responde la pregunta. ("¿Por qué esto devuelve 0")
Kirk Woll
8

Este ejemplo te ayudará.

 
    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
fuente