答案 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位整数。除此之外,| 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位整数。
[已添加重点]