2012-02-20 26 views
5

này là gì:Dòng này đang làm gì? arr.length >>> 0

arr.length >>> 0 

Và tại sao tôi nên muốn sử dụng nó?

+0

Tôi cũng cần trợ giúp về các thẻ để thêm tên của nhà điều hành đó, vì tôi không biết tên của nó – mithril333221

+0

Bối cảnh là vua ... hãy cho chúng tôi một số. – jondavidjohn

+3

Tôi thường không thích chỉnh sửa mã trong câu hỏi, nhưng tôi * khá * chắc chắn bạn có nghĩa là 'length', không phải' lenght'. –

Trả lời

8

Đó là toán tử thay đổi bên phải chưa ký. Trong trường hợp này (khi được sử dụng với 0), nó đảm bảo rằng arr.length là một số nguyên, hay đúng hơn là, đánh giá thành arr.length là giá trị số nguyên 32 bit không dấu nghiêm ngặt. (Điều này có nghĩa là nó không bao giờ NaN, không bao giờ tiêu cực, và không bao giờ có một phần thập phân.)

Ví dụ:

'1'  >>> 0: 1 
1   >>> 0: 1 
''  >>> 0: 0 
undefined >>> 0: 0 
null  >>> 0: 0 
1.0∙∙∙01 >>> 0: 1 

So sánh với:

Number('1')  : 1 
Number(1)  : 1 
Number('')  : 0 
Number(undefined): NaN 
Number(null)  : 0 
Number(1.0∙∙∙01) : 1.0∙∙∙01 

Nó chỉ có để đảm bảo rằng độ dài đúng đang được sử dụng.

5

Đảm bảo rằng .length là số nguyên 32 bit.

Trong hầu hết các trường, chỉ số mảng được giới hạn trong một phạm vi 32-bit (ít nhất là khi làm việc với Array.prototype phương pháp, và những hành vi kỳ diệu của .length).

+2

Bạn đã bỏ lỡ '… tại sao tôi nên sử dụng nó? '. Trường hợp duy nhất mà nó có thể được xem xét là nếu * length * có thể được đặt thành giá trị không phải số nguyên. Nhưng điều đó [không thể xảy ra] (http://es5.github.com/#x15.4.5.1) trong một triển khai phù hợp với ECMA-262. Độ dài là ** luôn ** một số nguyên không âm. Vì vậy, câu trả lời là: ** không bao giờ **. – RobG

+0

Tôi sẽ không nói "không bao giờ". Nó được sử dụng nếu bạn đang viết một shim cho một phương thức 'Array.prototype' tiêu chuẩn cố gắng để tuân thủ ECMA-262 (hoặc càng gần càng tốt), vì các phương thức chuẩn làm một chuyển đổi *' ToUint32 (lenVal) '*. Ngoài ra, đặc tả cho phép các phương thức 'Array.prototype' được áp dụng cho các đối tượng" giống mảng ". Điều này sẽ cung cấp động lực cho một shim để thực thi giá trị '.length' thích hợp. –

+0

Nếu đó là trường hợp, thì giá trị -ve cần phải được xử lý đầu tiên là '>>>' có một số hiệu ứng quyết liệt đối với chúng. Và nó giới hạn kích thước của độ dài đến một chút ít hơn so với sẵn có cho * array.length * được xây dựng sẵn, vì vậy nó là một phương pháp kém để đảm bảo hoặc chuyển đổi giá trị thành một số nguyên không âm. – RobG

Các vấn đề liên quan