Nó không chỉ chuyển đổi số không thành số, nó chuyển đổi chúng thành số có thể được biểu thị dưới dạng số nguyên không dấu 32 bit.
Mặc dù số JavaScript là nổi đúp chính xác (*), các nhà khai thác Bitwise ( <<
, >>
, &
, |
và ~
) được định nghĩa về hoạt động trên nguyên 32-bit. Thực hiện thao tác bitwise chuyển đổi số thành int có chữ ký 32 bit, mất bất kỳ phân số và bit nào ở vị trí cao hơn 32, trước khi thực hiện phép tính và sau đó chuyển đổi trở lại thành Số.
Vì vậy, thực hiện thao tác bitwise không có hiệu ứng thực tế, như dịch chuyển sang phải 0 bit >>0
, là cách nhanh chóng để làm tròn một số và đảm bảo nó nằm trong phạm vi int 32 bit. Ngoài ra, >>>
toán tử ba , sau khi thực hiện thao tác không dấu, chuyển đổi kết quả tính toán của nó thành Số thành số nguyên không dấu thay vì số nguyên đã ký mà các số khác thực hiện, do đó, nó có thể được sử dụng để chuyển đổi phủ định sang bổ sung 32 bit-hai phiên bản như một số lượng lớn. Việc sử dụng >>>0
đảm bảo bạn có số nguyên từ 0 đến 0xFFFFFFFF.
Trong trường hợp này, điều này rất hữu ích vì ECMAScript xác định các chỉ mục Mảng theo các số nguyên không dấu 32 bit. Vì vậy, nếu bạn đang cố gắng thực hiện array.filter
theo cách sao chép chính xác những gì tiêu chuẩn ECMAScript Fifth Edition nói, bạn sẽ chuyển số thành số không dấu 32 bit như thế này.
(Trên thực tế có rất ít nhu cầu thiết thực cho điều này là hy vọng mọi người sẽ không được thiết lập array.length
để 0.5
, -1
, 1e21
hoặc 'LEMONS'
. Nhưng đây là tác giả Javascript chúng ta đang nói về, vì vậy bạn không bao giờ biết ...)
Tóm lược:
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
(*: tốt, chúng được định nghĩa là hoạt động giống như phao. Tôi sẽ không ngạc nhiên nếu một số công cụ JavaScript thực sự sử dụng ints khi có thể, vì lý do hiệu suất. Nhưng đó sẽ là một chi tiết triển khai mà bạn sẽ không nhận được lợi thế của.)