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


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

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


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

Ответы:


157

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

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


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.


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.