哈克将javascript编号转换为UInt32

dot*_*ack 9 javascript bit-manipulation indexof uint32 operator-keyword

编辑:此问题已过期,因为Polyfill示例已更新.我在这里留下这个问题仅供参考.阅读关于按位移位运算符的有用信息的正确答案.


题:

在Mozilla Array.prototype.indexOf页面的Polyfill示例中的第7行,他们对此进行评论:

var length = this.length >>> 0; // Hack to convert object.length to a UInt32
Run Code Online (Sandbox Code Playgroud)

但Mozilla上的按位移位规范明确指出运算符返回与左操作数相同类型的值:

移位运算符将其操作数转换为32位整数,并返回与左操作数相同类型的结果.

所以不应该长度接收标准的64位浮点值?或者有人能指出黑客入手的地方?

fil*_*mor 11

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. 我们lnumToUint32(lval).
  6. 我们rnumToUint32(rval).
  7. 让我们shiftCount掩盖除了最低有效5位之外的所有数据rnum,即计算rnum & 0x1F.
  8. 返回lnumshiftCount位执行零填充右移的结果.空位用零填充.结果是无符号的32位整数.

  • TLDR; `var uint32 = num >>> 0` (3认同)