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

4

这里 我找到了下面这段代码:

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

有人能解释一下为什么这段代码将 hash 转换成了32位整数吗?

请注意,>>> 0 更为常见:它通过转换为无符号32位整数来确保结果为正数。 - Bergi
2个回答

4
原因在于位运算符在执行操作之前会将其参数隐式转换为32位整数。除此之外,"| 0" 对0执行按位OR操作,本质上相当于一个无操作。
在ES6规范中,"|"运算符被定义为12.11的二进制运算符,然后在12.11.3中定义了运行时语义
特别是,第7步和第9步将参数转换为32位整数,并且第11步将结果作为32位整数返回:
生产中的AA @ B,其中@是上述生产中的按位运算符之一,计算如下:
  1. lref成为评估A的结果。
  2. lval成为GetValue(lref)。
  3. ReturnIfAbrupt(lval)。
  4. rref成为评估B的结果。
  5. rval成为GetValue(rref)。
  6. ReturnIfAbrupt(rval)。
  7. lnum成为ToInt32(lval)。
  8. ReturnIfAbrupt(lnum)。
  9. rnum成为ToInt32(rval)。
  10. ReturnIfAbrupt(rnum)。
  11. 将按位运算符@应用于lnumrnum并返回结果。结果是一个带符号的32位整数。

[强调添加]


3
由于|是一个位运算符,所以会出现这种情况。
hash = hash | 0;

执行按位 or 操作,即将哈希值和零进行按位运算。

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

var x = 4;

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

感谢@Keith在评论中提到“JS中的位运算仅适用于32位有符号整数”。


谢谢,我知道,假设我们有1111 1111 1111 1111 1111 1111 1111 1111 1111 1111和零,其中所有位都是0。如果我们执行|操作,我们将得到5个字节。 - user6096764
@Jim2018 在JS中进行位运算时,只能使用32位有符号整数。 - Keith
@Keith 如果这是真的,那么这就是关键点,应该添加到答案中。 - user6096764
@Jim2018 是的,我认为这个答案会从中受益。如果他愿意,我会让amrender更新他的答案。 - Keith
@Keith 感谢提供额外信息。请随意更新我的答案,谢谢。 - amrender singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接