มันไม่เพียงแปลงไม่ใช่ตัวเลขให้เป็นตัวเลข แต่แปลงเป็นตัวเลขที่สามารถแสดงเป็น ints แบบไม่ลงนามแบบ 32 บิต
แม้ว่าตัวเลข JavaScript เป็นลอยแม่นยำสอง (*), ผู้ประกอบการบิต ( <<
, >>
, &
, |
และ~
) มีการกำหนดไว้ในแง่ของการดำเนินงานในจำนวนเต็ม 32 บิต การดำเนินการ bitwise จะแปลงตัวเลขเป็น int แบบ 32 บิตที่มีการสูญเสียเศษส่วนและบิตที่สูงกว่า 32 ก่อนทำการคำนวณแล้วแปลงกลับเป็น Number
ดังนั้นการดำเนินการระดับบิตโดยไม่มีผลกระทบที่แท้จริงเช่นการเลื่อนไปทางขวาของ 0 บิต>>0
เป็นวิธีที่รวดเร็วในการปัดเศษตัวเลขและให้แน่ใจว่าอยู่ในช่วง int 32- บิต นอกจากนี้ตัว>>>
ดำเนินการสามตัวหลังจากทำการดำเนินการที่ไม่ได้ลงชื่อแปลงผลลัพธ์ของการคำนวณเป็น Number เป็นจำนวนเต็มที่ไม่ได้ลงนามแทนที่จะเป็นจำนวนเต็มที่มีเครื่องหมายที่คนอื่นทำดังนั้นจึงสามารถใช้ในการแปลงเนกาทีฟให้เป็น 32 บิต รุ่นเป็นจำนวนมาก การใช้>>>0
ให้แน่ใจว่าคุณมีจำนวนเต็มระหว่าง 0 ถึง 0xFFFFFFFF
ในกรณีนี้สิ่งนี้มีประโยชน์เพราะ ECMAScript กำหนดดัชนี Array ในรูปของ 32 บิตที่ไม่ได้ลงนาม ints ดังนั้นหากคุณกำลังพยายามที่จะนำไปใช้array.filter
ในลักษณะที่ซ้ำกับที่มาตรฐาน ECMAScript Fifth Edition บอกเอาไว้อย่างแน่นอนคุณจะต้องใช้ตัวเลข 32- บิตแบบไม่ลงนามแบบนี้
(ในความเป็นจริงมีความจำเป็นในการปฏิบัติเล็ก ๆ น้อย ๆ นี้เช่นหวังว่าคนจะไม่ได้ไปจะได้รับการตั้งค่าarray.length
เพื่อ0.5
, -1
, 1e21
หรือ'LEMONS'
. แต่นี้เป็นผู้เขียน JavaScript เรากำลังพูดถึงเพื่อให้คุณไม่เคยรู้ ... )
สรุป:
1>>>0 === 1
-1>>>0 === 0xFFFFFFFF -1>>0 === -1
1.7>>>0 === 1
0x100000002>>>0 === 2
1e21>>>0 === 0xDEA00000 1e21>>0 === -0x21600000
Infinity>>>0 === 0
NaN>>>0 === 0
null>>>0 === 0
'1'>>>0 === 1
'x'>>>0 === 0
Object>>>0 === 0
(*: พวกมันถูกนิยามว่าทำตัวเหมือนลอย ๆ มันจะไม่แปลกใจเลยถ้าเครื่องมือ JavaScript บางอันใช้ ints จริง ๆ เท่าที่จะทำได้ด้วยเหตุผลด้านประสิทธิภาพ แต่นั่นจะเป็นรายละเอียดของการใช้งาน ประโยชน์จาก.)