左移 (<<)
左移 (<<) 运算符返回一个数字或 BigInt,其二进制表示是第一个操作数向左移动指定位数的结果。向左移出的多余位将被丢弃,并从右侧移入零位。
试一试
const a = 5; // 00000000000000000000000000000101
const b = 2; // 00000000000000000000000000000010
console.log(a << b); // 00000000000000000000000000010100
// Expected output: 20
语法
x << y
描述
<< 运算符对两种类型的操作数进行了重载:number 和 BigInt。对于数字,该运算符返回一个 32 位整数。对于 BigInt,该运算符返回一个 BigInt。它首先将两个操作数强制转换为数值,然后测试它们的类型。如果两个操作数都变为 BigInt,则执行 BigInt 左移;否则,它将两个操作数转换为32 位整数并执行数字左移。如果一个操作数变为 BigInt 而另一个操作数变为数字,则会抛出 TypeError。
该运算符以二进制补码形式对左操作数的位表示进行操作。例如,9 << 2 得到 36。
9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10)
将一个 32 位整数 x 向左按 y 位进行位移,得到 x * 2 ** y。所以,例如,9 << 3 等同于 9 * (2 ** 3) = 9 * (8) = 72。
如果左操作数是超过 32 位的数字,则其最高有效位将被丢弃。例如,以下超过 32 位的整数将转换为 32 位整数:
Before: 11100110111110100000000000000110000000000001 After: 10100000000000000110000000000001
右操作数将被转换为一个无符号 32 位整数,然后取模 32,因此实际的移位偏移量将始终是一个介于 0 到 31 之间(包括 0 和 31)的正整数。例如,100 << 32 与 100 << 0 相同(并产生 100),因为 32 模 32 是 0。
警告:你可能会看到有人使用 << 0 将数字截断为整数。将任何数字 x 向左移 0 位,返回 x 转换为 32 位整数的结果,这还会移除超出 -2147483648 到 2147483647 范围的数字的开头位。请改用 Math.trunc()。
对于 BigInt,没有截断。从概念上讲,将正 BigInt 理解为具有无限数量的前导 0 位,将负 BigInt 理解为具有无限数量的前导 1 位。
示例
使用左移
9 << 3; // 72
// 9 * (2 ** 3) = 9 * (8) = 72
9n << 3n; // 72n
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-left-shift-operator |
浏览器兼容性
加载中…