Apa artinya "|" (pipa tunggal) lakukan dalam JavaScript?

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

Mengapa 0.5 | 0mengembalikan nol, tetapi bilangan bulat apa pun (termasuk negatif) mengembalikan bilangan bulat input? Apa yang dilakukan oleh pipa tunggal ("|")?

Matrym
sumber
12
Ini membantu mencegah kesalahan sintaksis memperingatkan Anda tentang fakta bahwa Anda mengetik | bukannya ||
Andrew Myers

Jawaban:

157

Ini agak bitwise atau .
Karena operasi bitwise hanya masuk akal pada bilangan bulat,0.5 terpotong.

0 | xadalah x, untuk apa pun x.

Slaks
sumber
9
itu cara yang bagus untuk mengonversi angka floating-point ke int, atau gunakanparseInt()
MaBi
5
@ MaBi: Namun Anda harus tahu bahwa nilai tersebut dikonversi ke integer 32-bit, sehingga tidak akan berfungsi dengan baik untuk angka yang lebih besar.
Guffa
1
Jadi dapatkah dianggap sama dengan fungsi Lantai?
13
2
Gunakan ini hanya untuk bitwise atau. Seperti yang dikatakan @Guffa, sejumlah besar tidak akan berperilaku seperti yang diharapkan. Mis: 248004937500 | 0 = -1103165668
Joseph Connolly
Jumlah besar akan meluap karena dikonversi ke 32-bit int.
suka
151

Perbandingan bit sangat sederhana sehingga hampir tidak bisa dimengerti;) Lihat "nybble" ini

   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 dan 10 akan memberi Anda 14:

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

Sangat membingungkan!

Angka tiga
sumber
16
Bekerja untuk Boolean juga. JS menafsirkan benar sebagai 1, salah sebagai 0; soalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
gordon
21

Satu pipa sedikit bijak ATAU .

Lakukan operasi ATAU pada setiap pasangan bit. a ATAU b menghasilkan 1 jika a atau b adalah 1.

JavaScript memotong angka-angka non-integer dalam operasi bitwise, sehingga dihitung sebagai 0|0, yaitu 0.

Yahel
sumber
6
Ini tidak menjawab pertanyaan. ("Mengapa ini mengembalikan 0")
Kirk Woll
8

Contoh ini akan membantu Anda.

 
    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
sumber