JavaScript lớn hơn gấp ba lần


88

Tôi đã thấy cú pháp này trên một bài đăng StackOverflow khác và tò mò không biết nó có tác dụng gì:

var len = this.length >>> 0;

Không gì >>>có nghĩa?


1
Đó là một toán tử dịch phải, nhưng tại sao bạn lại dịch phải bằng 0? Đó có phải là một số cách làm rẻ tiền parseInt?
Rocket Hazmat

5
>>>luôn đặt bit dấu thành 0, ngay cả khi bạn dịch chuyển bằng 0 bit.
John Flatness

4
Kiểm tra câu trả lời này về lý do tại sao họ sử dụng >>>toán tử trong trường hợp này : stackoverflow.com/questions/3081987/…
Christian C. Salvadó

1
Dấu

Tôi thấy rằng cú pháp trong developer.mozilla.org/en/docs/Web/JavaScript/Reference/... var length = list.length >>> 0; (trường hợp sử dụng giống như một của bạn)
Mars Robertson

Câu trả lời:


49

Đó là một toán tử ca bên phải không dấu . Điều thú vị là, nó là toán tử bitwise duy nhất không được đăng nhập trong JavaScript.

Toán tử >>> dịch các bit của biểu thức1 sang phải bằng số bit được chỉ định trong biểu thức2. Các số 0 được điền từ bên trái. Các chữ số bị dịch chuyển sang bên phải sẽ bị loại bỏ.


107

Bỏ qua ý nghĩa dự định của nó, đây rất có thể là nơi bạn sẽ thấy nó được sử dụng:


>>> 0 là duy nhất ở chỗ nó là toán tử duy nhất sẽ chuyển đổi bất kỳ kiểu nào thành số nguyên dương:

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

Trong ví dụ của bạn var len = this.length >>> 0, đây là một cách lấy độ dài số nguyên để sử dụng để lặp lại this, bất kỳ loại nào this.lengthcó thể là.


Tương tự, ~~xcó thể được sử dụng để chuyển bất kỳ biến nào thành số nguyên có dấu.


bạn có thể giải thích làm thế nào để lặp lại bằng cách sử dụng >>>?

1
@ K48 Tôi không nghĩ ý của anh ấy là lặp lại , tôi nghĩ anh ấy muốn nói điều này buộc độ dài phải trở thành một con số. (Nếu không, tôi đều nhầm lẫn.) Nhưng đây là một câu trả lời tuyệt vời mà elucidates hơn: stackoverflow.com/questions/1822350/...
Mike Williamson

8

Toán tử đó là một chuyển dịch phải hợp lý. Ở đây số được dịch chuyển 0 bit. Sự dịch chuyển của các bit 0 về mặt toán học sẽ không có tác dụng.

Nhưng ở đây nó được sử dụng để chuyển đổi giá trị thành một số nguyên 32 bit không dấu.


3

>>>là một toán tử khôn ngoan, dịch chuyển phải không điền .

Tôi nghĩ tác dụng duy nhất của >>> 0một số dương là làm tròn xuống số nguyên gần nhất, giống như Math.floor(). Tôi không hiểu tại sao điều này lại cần thiết trong ví dụ của bạn, vì nói chung một thuộc .lengthtính (ví dụ: của an Array) sẽ là một số nguyên rồi.

Tôi cũng thấy ngắn hơn một chút ~~được sử dụng trong cùng một cách: ~~9.5 == 9; // true.


Tôi nghi ngờ nó cũng giống như Math.abs()khi được sử dụng cho các số âm.
Al Kepp

6
Nếu bạn làm >>> 0với một số âm, nó sẽ chuyển nó thành lời khen của 2, sau đó sẽ chuyển đúng. Do đó -14 >>> 0 == 1073741820. ( msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx )
Rocket Hazmat

@AlKepp - vâng, tôi đã thấy lỗi và sửa nó - lẽ ra phải kiểm tra trước, nhưng đây rõ ràng là một câu hỏi rút ra nhanh :).
nrabinowitz
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.