Що означає "|" (однотрубна) робити в 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
То чи можна вважати таким же, як функція підлоги?
травень13,

2
Використовуйте це лише для розрядних або Як сказав @Guffa, велика кількість не буде вести себе так, як очікувалося. Вихід: 248004937500 | 0 = -1103165668
Джозеф Конноллі

Велика кількість переповниться, оскільки вони перетворені на 32-бітний int.
slikts

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)

Побітові значення OR 6 і 10 дадуть вам 14:

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

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


16
Працює і для Boolean. JS інтерпретує true як 1, false - 0; такalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
Гордон

21

Одина труба - це трохи розумно АБО .

Виконує операцію АБО на кожній парі бітів. a АБ b дає 1, якщо або a, або b дорівнює 1.

JavaScript обрізає будь-які не цілі числа в розрядних операціях, тому обчислюється як 0|0, що дорівнює 0.


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.