JavaScript tiga kali lipat lebih besar dari

89

Saya melihat sintaks ini di pos StackOverflow lain dan ingin tahu apa fungsinya:

var len = this.length >>> 0;

Apa artinya >>>?

Jey Balachandran
sumber
1
Itu operator shift kanan, tapi kenapa Anda menggeser kanan dengan nol? Apakah itu cara yang murah untuk melakukannya parseInt?
Rocket Hazmat
5
>>>selalu menyetel bit tanda ke nol, bahkan jika Anda menggeser bit nol.
John Flatness
4
Periksa jawaban ini tentang mengapa mereka menggunakan dalam kasus ini >>>operator: stackoverflow.com/questions/3081987/…
Christian C. Salvadó
1
Tanda
Saya melihat sintaks itu di developer.mozilla.org/en/docs/Web/JavaScript/Reference/… var length = list.length >>> 0; (kasus penggunaan yang sama seperti Anda)
Mars Robertson

Jawaban:

49

Itu adalah operator shift kanan tanpa tanda tangan . Menariknya, ini adalah satu-satunya operator bitwise yang tidak ditandatangani di JavaScript.

Operator >>> menggeser bit ekspresi1 ke kanan dengan jumlah bit yang ditentukan dalam ekspresi2. Angka nol diisi dari kiri. Digit yang digeser dari kanan akan dibuang.

Joe
sumber
107

Mengabaikan makna yang dimaksudkan, kemungkinan besar di sinilah Anda akan melihatnya digunakan:


>>> 0 unik karena merupakan satu-satunya operator yang akan mengonversi jenis apa pun menjadi bilangan bulat positif:

"string"         >>> 0 == 0
(function() { }) >>> 0 == 0
[1, 2, 3]        >>> 0 == 0
Math.PI          >>> 0 == 3

Dalam contoh Anda var len = this.length >>> 0, ini adalah cara untuk mendapatkan panjang bilangan bulat yang akan digunakan untuk mengulang this, apa pun jenisnya this.length.


Demikian pula, ~~xdapat digunakan untuk mengubah variabel apa pun menjadi bilangan bulat bertanda.

Eric
sumber
dapatkah Anda menjelaskan cara mengulang menggunakan >>>?
1
@ K48 Saya tidak berpikir dia bermaksud mengulangi , saya pikir dia bermaksud mengatakan ini memaksa panjang menjadi angka. (Kalau tidak, saya sama-sama bingung.) Tapi inilah jawaban bagus yang menjelaskan lebih lanjut: stackoverflow.com/questions/1822350/…
Mike Williamson
9

Operator itu adalah shift kanan logis. Di sini jumlahnya digeser 0 bit. Pergeseran bit nol secara matematis seharusnya tidak berpengaruh.

Tapi di sini digunakan untuk mengubah nilai menjadi integer 32 bit unsigned.

Mark Byers
sumber
3

>>>adalah operator yang sedikit bijak, shift kanan tanpa isi .

Saya pikir satu-satunya efek >>> 0pada bilangan positif adalah membulatkan ke bawah ke bilangan bulat terdekat, sama seperti Math.floor(). Saya tidak melihat mengapa ini perlu dalam contoh Anda, karena umumnya .lengthproperti (misalnya dari an Array) sudah menjadi bilangan bulat.

Saya juga melihat sedikit lebih pendek yang ~~digunakan dengan cara yang sama: ~~9.5 == 9; // true.

nrabinowitz
sumber
Saya ragu itu sama seperti Math.abs()saat digunakan untuk bilangan negatif.
Al Kepp
6
Jika Anda melakukannya >>> 0pada bilangan negatif, ia mengubahnya menjadi pujian 2, kemudian lakukan pergeseran ke kanan. Karena itu -14 >>> 0 == 1073741820. ( msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx )
Rocket Hazmat
@AlKepp - ya, saya melihat kesalahan dan memperbaikinya - seharusnya diuji terlebih dahulu, tetapi ini jelas merupakan pertanyaan menggambar cepat :).
nrabinowitz