Những gì làm | (ống đơn) làm gì trong JavaScript?


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

Tại sao 0.5 | 0trả về 0, nhưng bất kỳ số nguyên nào (bao gồm âm) trả về số nguyên đầu vào? Ống đơn ("|") làm gì?


12
Nó hữu ích ngăn ngừa lỗi cú pháp cảnh báo bạn về thực tế là bạn đã gõ | thay vì | |
Andrew Myers

Câu trả lời:


157

Đây là một chút hoặc .
Vì các phép toán bitwise chỉ có ý nghĩa trên các số nguyên, 0.5bị cắt ngắn.

0 | xx, cho bất kỳ x.


8
đó là một cách hay để chuyển đổi số dấu phẩy động sang int hoặc sử dụngparseInt()
MaBi 14/03/2015

4
@MaBi: Tuy nhiên, bạn nên biết rằng giá trị được chuyển đổi thành số nguyên 32 bit, vì vậy nó sẽ không hoạt động chính xác cho các số lớn hơn.
Guffa

1
Vì vậy, có thể được coi là giống như chức năng Tầng?
May13ank

2
Chỉ sử dụng điều này cho bitwise hoặc. Như @Guffa đã nói, số lượng lớn sẽ không hoạt động như mong đợi. Vd: 248004937500 | 0 = -1103165668
Joseph Connolly

Số lượng lớn sẽ tràn vì chúng được chuyển đổi thành int 32 bit.
slikts

151

So sánh bit rất đơn giản, nó gần như không thể hiểu được;) Hãy xem "nybble" này

   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 và 10 sẽ cung cấp cho bạn 14:

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

Khó hiểu khủng khiếp!


16
Hoạt động cho Boolean là tốt. JS diễn giải đúng là 1, sai là 0; vì vậyalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
gordon

21

Một ống duy nhất là một chút khôn ngoan HOẶC .

Thực hiện thao tác OR trên mỗi cặp bit. a OR b mang lại 1 nếu a hoặc b là 1.

JavaScript cắt bất kỳ số không nguyên nào trong các phép toán bitwise, do đó, nó được tính 0|0là 0.


6
Điều này không trả lời câu hỏi. ("Tại sao điều này trở về 0")
Kirk Woll

8

Ví dụ này sẽ giúp bạn.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.