【发布时间】:2019-06-21 18:00:31
【问题描述】:
【问题讨论】:
-
请注意,
>>> 0更常见:它通过转换为 无符号 32 位整数来确保结果为正数。
标签: javascript
【问题讨论】:
>>> 0 更常见:它通过转换为 无符号 32 位整数来确保结果为正数。
标签: javascript
这是因为| 是位运算符。所以
hash = hash | 0;
执行按位 or 操作,即按位 or 的哈希和零。
您也会观察到其他位运算符的类似行为,例如:
var x = 4;
console.log(4 >> 1); // right shift bitwise operator
感谢@Keith 提到“JS 中的 Bitwize 操作,只有 32 位有符号整数。”在评论中。
【讨论】:
0。如果我们这样做 |我们将得到 5 个字节。
原因是按位运算符在应用运算符之前将其参数隐式转换为 32 位整数。除此之外,| 0 与0 执行按位或,这本质上是一个空操作。
在 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,其中@是位运算符之一 上面的产品,评估如下:
- 令 lref 为评估 A 的结果。
- 让 lval 为 GetValue(lref)。
- ReturnIfAbrupt(lval)。
- 令 rref 为评估 B 的结果。
- 让 rval 为 GetValue(rref)。
- ReturnIfAbrupt(rval).
- 让 lnum 为 ToInt32(lval)。
- ReturnIfAbrupt(lnum).
- 让 rnum 为 ToInt32(rval)。
- ReturnIfAbrupt(rnum).
- 返回将按位运算符@ 应用于lnum 和rnum 的结果。 结果是一个有符号的 32 位整数。
[强调添加]
【讨论】: