JavaScript位运算符一律将操作数转为32位有符号整数再计算,经ToInt32转换(范围−2147483648~2147483647),不支持BigInt;右移分有符号(>>)和无符号(>>>),需警惕截断与类型混淆。

JavaScript 中的 Number 类型是 64 位双精度浮点数(IEEE 754),但位运算符(如 &、|、^、<<、>>、>>>)却按 32 位有符号整数处理操作数——这是理解其行为的关键矛盾点。
位运算前的隐式类型转换
所有位运算符都会先将操作数强制转为 32 位有符号整数(即 ToInt32 抽象操作):
- 先调用
ToNumber转成数字,若失败(如"abc")则得NaN,再转为0; - 然后截断小数部分(向零取整),例如
5.9 → 5,-3.7 → -3; - 再对结果模 2³²,再按补码规则映射到 [-2³¹, 2³¹−1] 区间。例如:
Math.pow(2, 32) + 1→(2³² + 1) % 2³² = 1;-1→ 补码表示为0xFFFFFFFF(即十进制 −1);-2147483649→ 模 2³² 后等于2147483647(即2³¹−1)。
右移运算符的区别:>> vs >>>
>> 是**有符号右移**,高位补符号位;>>> 是**无符号右移**,高位恒补 0:
-
-1 >> 0→-1(二进制0xFFFFFFFF,算术右移仍为0xFFFFFFFF); -
-1 >>> 0→4294967295(即0xFFFFFFFF当作无符号整数解释); -
0xFF >> 4→15(255 >> 4 = 15);0xFF >>> 4结果相同,因原数非负。
为什么浮点数能参与位运算?
因为 JS 引擎在执行位运算时,不关心原始值是否“看起来像整数”,只按规范做两步:
① 将操作数转为数字;② 立即应用 ToInt32。所以即使写 3.14 | 0,实际是 ToInt32(3.14) | ToInt32(0) = 3 | 0 = 3。
常见用途包括取整(x | 0)、快速幂次判断(n & (n−1) === 0 判断是否为 2 的幂)、颜色分量提取等。
注意事项与陷阱
位运算不是“整数专属”,但行为完全由 ToInt32 决定,因此易出错:
立即学习“Java免费学习笔记(深入)”;
- 超过 32 位整数范围的数会被“折叠”,如
0x100000000 | 0得0(因2³² % 2³² = 0); -
NaN、Infinity、-Infinity经ToInt32后都变成0; -
undefined和null先转为0,再参与运算; - 字符串若不能转为有效数字(如
"12a"),会先得NaN,再得0。


















