簡體   English   中英

哈克將javascript編號轉換為UInt32

[英]Hack to convert javascript number to UInt32

編輯:此問題已過期,因為Polyfill示例已更新。 我在這里留下這個問題僅供參考。 閱讀關於按位移位運算符的有用信息的正確答案。


題:

在Mozilla Array.prototype.indexOf頁面的Polyfill示例中的第7行,他們對此進行評論:

var length = this.length >>> 0; // Hack to convert object.length to a UInt32

但Mozilla上的按位移位規范明確指出運算符返回與左操作數相同類型的值:

移位運算符將其操作數轉換為32位整數,並返回與左操作數相同類型的結果。

所以不應該長度接收標准的64位浮點值? 或者有人能指出我黑客入手的地方?

ECMAScript規范聲明該值在http://www.ecma-international.org/ecma-262/5.1/#sec-11.7的步驟5和8中轉換為UInt32:

11.7.3無符號右移運算符(>>>)

對左操作數執行零填充按位右移操作,操作數由右操作數指定。

生產ShiftExpression : ShiftExpression >>> AdditiveExpression的計算方法如下:

  1. lref成為評估ShiftExpression的結果。
  2. lvalGetValue(lref)
  3. rref成為評估AdditiveExpression的結果。
  4. rvalGetValue(rref)
  5. lnum成為ToUint32(lval)
  6. rnum成為ToUint32(rval)
  7. shiftCount是屏蔽除rnum的最低有效5位之外的所有位的rnum ,即計算rnum & 0x1F
  8. 返回通過shiftCount位執行lnum的零填充右移的結果。 空位用零填充。 結果是無符號的32位整數

實際上,結果被轉換回一個數字,即64位精度浮點數。 但是,在轉換回來之前,兩個操作數都轉換為UInt32 ,然后執行右移操作。 這在ECMAScript中有詳細說明: http//www.ecma-international.org/ecma-262/5.1/#sec-11.7.3

因此, length >>> 0的凈結果是因為>>> 0本身是無操作,將length轉換為UInt32然后再轉換為雙UInt32 到底有什么好處呢? 它會強制精度損失,並有效地強制值為1),整數和2)在[0,2 ^ 32-1]范圍內。 例如,如果它是-1,它將變為2 ^ 32-1 == 4294967295。如果是,3.6,它將變為3。

如果您運行此測試,Math.floor將執行相同的操作。 如果您想在一個月左右的時間內了解自己的代碼,就應該避免這些黑客攻擊。

var a=3.6, b = a >>> 0;
console.log(b);
console.log(Math.floor(a));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM