为什么`number | = 0`转换为32位整数?

时间:2019-01-28 17:07:01

标签: javascript

Here我发现了以下代码:

hash = hash | 0; // Convert to 32bit integer

谁能解释为什么此代码将hash转换为32位整数?

2 个答案:

答案 0 :(得分:3)

这是因为|是按位运算符。所以

hash = hash | 0;

执行按位or的操作,即哈希和零的按位or

对于其他按位运算符,您也会观察到类似的行为,例如:

var x = 4;

console.log(4 >> 1); // right shift bitwise operator

感谢@Keith提到:“ JS中的Bitwize操作仅是32位带符号的int。”在评论中。

答案 1 :(得分:2)

原因是按位运算符在应用运算符之前隐式将其参数转换为32位整数。除此之外,| 00执行按位或运算,这实际上是一个空操作。

在ES6规范中,|运算符是defined as a binary operator in 12.11,然后是runtime semantics are defined in 12.11.3

特别是,步骤7和9将参数强制转换为32位整数,而步骤11将结果返回为32位整数:

  

生产 A A @ B ,其中@是其中的按位运算符之一   以上产品的评估如下:

     
      
  1. lref 成为评估 A 的结果。
  2.   
  3. lval GetValue lref )。
  4.   
  5. ReturnIfAbrupt lval )。
  6.   
  7. rref 成为评估 B 的结果。
  8.   
  9. rval GetValue rref )。
  10.   
  11. ReturnIfAbrupt rval )。
  12.   
  13. lnum ToInt32 lval )。
  14.   
  15. ReturnIfAbrupt lnum )。
  16.   
  17. rnum ToInt32 rval )。
  18.   
  19. ReturnIfAbrupt rnum )。
  20.   
  21. 返回对 lnum rnum 应用按位运算符@的结果。 结果是一个有符号的32位整数。
  22.   
     

[已添加重点]