JavaScript ES6(<<)中的按位左移是否超过63的移位?

hou*_*ker 5 javascript v8 javascriptcore

我对JS(ES6)中的"按位左操作符"的理解是,右边的空白用零填充.

然而,根据经验,我注意到在V8和JSC中,如果我们移动64或更多,设置位似乎突然重新出现.

(255 << 64).toString(2)
//-> "11111111" 
Run Code Online (Sandbox Code Playgroud)

这与我的预期相反,即更大的变化将无限期地产生右边的零.

我没有立即在EcmaScript 2016页面中看到这种行为在<< - 我错过了什么,或者对于较大的班次可能是未定义的行为?

Der*_*會功夫 7

规范(第12.8.3.1节)规定了要移位的位数:

ShiftExpression:ShiftExpression << AdditiveExpression

  1. 让lref成为评估ShiftExpression的结果.
  2. 让lval成为
  3. 的GetValue(LREF).
  4. ReturnIfAbrupt(lval中).
  5. 让rref成为评估AdditiveExpression的结果.
  6. 设rval为GetValue(rref).
  7. ReturnIfAbrupt(RVAL).
  8. 让lnum成为ToInt32(lval).
  9. ReturnIfAbrupt(lnum缓冲区里).
  10. 让rnum成为ToUint32(rval).
  11. ReturnIfAbrupt(RNUM).
  12. 设shiftCount是屏蔽除rnum的最低有效5位之外的所有位的结果,即计算rnum和0x1F.
  13. 通过shiftCount位返回左移lnum的结果.结果是带符号的32位整数.

由于64和0x1F为0,因此意味着"无移位",这就是这些位"重新出现"的原因.

TL;博士

要移位的位数上限为31,即

function shiftLeft(number, numShift) {
    return number << (numShift % 32);  // equivalent code
}
Run Code Online (Sandbox Code Playgroud)