Что означает «|» (одну трубу) делать в JavaScript?

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

Почему 0.5 | 0возвращает ноль, но любое целое число (включая отрицательное) возвращает входное целое число? Что делает одна труба ("|")?

Matrym
источник
12
Он предупреждает о том, что синтаксические ошибки предупреждают вас о том, что вы ввели | вместо ||
Эндрю Майерс

Ответы:

157

Это побитовое или .
Поскольку побитовые операции имеют смысл только для целых чисел, они 0.5усекаются.

0 | xесть x, для любого x.

SLaks
источник
9
это хороший способ преобразовать число с плавающей точкой в ​​int или использоватьparseInt()
MaBi
5
@MaBi: Однако вы должны знать, что значение преобразуется в 32-разрядное целое число, поэтому оно не будет работать должным образом для больших чисел.
Гуффа
1
Так что же можно считать функцией пола?
May13ank
2
Используйте это только для побитового или. Как сказал @Guffa, большие числа будут вести себя не так, как ожидалось. Пример: 248004937500 | 0 = -1103165668
Джозеф Коннолли
Большие числа будут переполнены, потому что они конвертированы в 32-битное целое число.
Сликц
151

Сравнение битов настолько просто, что почти непостижимо;) Посмотри на этот "клочок"

   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 6 и 10 даст вам 14:

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

Страшно запутанно!

тройка
источник
16
Работает и для логического типа. JS интерпретирует истину как 1, ложь как 0; такalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
Гордон
21

Одиночная труба - это немного ИЛИ .

Выполняет операцию ИЛИ на каждой паре битов. ИЛИ b выдает 1, если либо a, либо b равно 1.

JavaScript обрезает любые нецелые числа в побитовых операциях, поэтому его вычисляется как 0|00.

Yahel
источник
6
Это не отвечает на вопрос. («Почему это возвращает 0»)
Кирк Волл
8

Этот пример поможет вам.

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

Никхил Махиррао
источник