JavaScript สามเท่ามากกว่า


89

ฉันเห็นไวยากรณ์นี้ในโพสต์ StackOverflowอื่นและอยากรู้ว่ามันทำอะไร:

var len = this.length >>> 0;

สิ่งที่ไม่>>>บ่งบอก?


1
นั่นเป็นตัวดำเนินการกะที่ถูกต้อง แต่ทำไมคุณถึงเปลี่ยนด้วยศูนย์? เป็นวิธีการทำราคาถูกparseIntหรือไม่?
Rocket Hazmat

5
>>>ตั้งค่าบิตเครื่องหมายเป็นศูนย์เสมอแม้ว่าคุณจะเลื่อนด้วยศูนย์บิตก็ตาม
John Flatness

4
ตรวจสอบคำตอบว่าเหตุใดจึงใช้ในกรณีนี้ตัว>>>ดำเนินการ: stackoverflow.com/questions/3081987/…
Christian C. Salvadó

1
JavaScript triple angle bracket
wprl

ฉันเห็นไวยากรณ์นั้นในdeveloper.mozilla.org/en/docs/Web/JavaScript/Reference/… var length = list.length >>> 0; (กรณีการใช้งานเดียวกับของคุณ)
Mars Robertson

คำตอบ:


49

นั่นคือผู้ประกอบการได้รับการรับรองการเปลี่ยนแปลงทางขวา ที่น่าสนใจคือมันเป็นตัวดำเนินการแบบ bitwise ตัวเดียวที่ไม่ได้ลงนามใน JavaScript

ตัวดำเนินการ >>> เลื่อนบิตของนิพจน์ 1 ไปทางขวาตามจำนวนบิตที่ระบุในนิพจน์ 2 ศูนย์จะถูกเติมจากด้านซ้าย ตัวเลขที่เลื่อนออกไปทางขวาจะถูกทิ้ง


107

โดยไม่สนใจความหมายที่ตั้งใจไว้นี่เป็นไปได้มากว่าคุณจะเห็นว่าใช้:


>>> 0 มีความพิเศษตรงที่เป็นตัวดำเนินการเดียวที่จะแปลงประเภทใด ๆ เป็นจำนวนเต็มบวก:

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

ในตัวอย่างของคุณvar len = this.length >>> 0นี่คือวิธีการรับความยาวจำนวนเต็มเพื่อใช้ในการวนซ้ำthisไม่ว่าthis.lengthจะเป็นประเภทใดก็ตาม


ในทำนองเดียวกัน~~xสามารถใช้เพื่อแปลงตัวแปรใด ๆ เป็นจำนวนเต็มเซ็น


คุณสามารถอธิบายวิธีการทำซ้ำโดยใช้>>>?

1
@ K48 ฉันไม่คิดว่าเขาหมายถึงการวนซ้ำฉันคิดว่าเขาตั้งใจจะบอกว่าความยาวของกองกำลังนี้จะกลายเป็นตัวเลข (ไม่งั้นฉันก็งงพอ ๆ กัน) แต่นี่คือคำตอบที่ดีที่อธิบายได้มากกว่า: stackoverflow.com/questions/1822350/…
Mike Williamson

9

ตัวดำเนินการนั้นคือการเลื่อนทางขวาเชิงตรรกะ นี่คือจำนวนที่เลื่อน 0 บิต การเปลี่ยนศูนย์บิตทางคณิตศาสตร์ไม่ควรมีผล

แต่ในที่นี้จะใช้เพื่อแปลงค่าเป็นจำนวนเต็ม 32 บิตที่ไม่ได้ลงชื่อ


3

>>>เป็นผู้ประกอบบิตฉลาดกะศูนย์เติมขวา

ผมคิดว่ามีผลเฉพาะของอยู่เป็นจำนวนมากในเชิงบวกคือการลงรอบเต็มที่ใกล้เคียงที่สุดเช่นเดียวกับ>>> 0 Math.floor()ฉันไม่เห็นว่าเหตุใดจึงจำเป็นในตัวอย่างของคุณเนื่องจากโดยทั่วไป.lengthคุณสมบัติ (เช่นของArray) จะเป็นจำนวนเต็มอยู่แล้ว

ฉันยังเห็นการ~~ใช้ที่สั้นกว่าเล็กน้อยในลักษณะเดียวกัน: ~~9.5 == 9; // true.


ฉันสงสัยว่ามันเหมือนกับMath.abs()เมื่อใช้สำหรับจำนวนลบ
Al Kepp

6
ถ้าคุณ>>> 0ใช้จำนวนลบมันจะแปลงเป็นคำชมเชย 2 จากนั้นจะเปลี่ยนไปทางขวา ดังนั้น-14 >>> 0 == 1073741820. ( msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx )
Rocket Hazmat

@AlKepp - ใช่ฉันเห็นข้อผิดพลาดและแก้ไขแล้ว - ควรทดสอบก่อน แต่นี่เป็นคำถามที่ดึงออกมาได้อย่างชัดเจน :)
nrabinowitz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.