JavaScript的Bitwise Operators也就是位运算符,是直接对操作数的二进制位进行操作的运算符,在权限设计、状态标记等场景中有着独特的优势。相比使用数组或对象存储权限信息,位运算实现权限管理内存占用更低,操作效率更高。

JavaScript 位运算符基础
JavaScript中的位运算符会先将操作数转换为32位有符号整数,再对二进制位进行操作,最后将结果转换回JavaScript数值。常用的位运算符如下:
| 运算符 | 名称 | 作用说明 |
|---|---|---|
| & | 按位与 | 两个操作数对应位都为1时,结果位为1,否则为0 |
| | | 按位或 | 两个操作数对应位有一个为1时,结果位为1,否则为0 |
| ^ | 按位异或 | 两个操作数对应位不同时,结果位为1,否则为0 |
| ~ | 按位非 | 对操作数的每一位取反,0变1,1变0 |
| << | 左移 | 将操作数的二进制位向左移动指定位数,右侧补0 |
| >> | 有符号右移 | 将操作数的二进制位向右移动指定位数,左侧补符号位 |
| >>> | 无符号右移 | 将操作数的二进制位向右移动指定位数,左侧补0 |
基础位运算示例
下面通过具体代码演示常用位运算符的效果:
// 定义两个测试数字 let a = 5; // 二进制为 00000000 00000000 00000000 00000101 let b = 3; // 二进制为 00000000 00000000 00000000 00000011 // 按位与运算 console.log(a & b); // 结果为1,二进制 00000000 00000000 00000000 00000001 // 按位或运算 console.log(a | b); // 结果为7,二进制 00000000 00000000 00000000 00000111 // 按位异或运算 console.log(a ^ b); // 结果为6,二进制 00000000 00000000 00000000 00000110 // 左移运算,5左移1位相当于5*2 console.log(a << 1); // 结果为10,二进制 00000000 00000000 00000000 00001010 // 有符号右移,5右移1位相当于5/2取整 console.log(a >> 1); // 结果为2,二进制 00000000 00000000 00000000 00000010
位运算在权限设计中的应用
权限设计的核心需求通常是:判断用户是否拥有某个权限、给用户添加权限、移除用户的某个权限。使用位运算实现这些需求非常简洁高效。
权限定义
首先我们为每个权限分配一个独立的二进制位,通常从右往左数,第1位代表权限1,第2位代表权限2,以此类推。可以通过左移运算符快速定义权限值:
// 定义权限枚举,每个权限对应一个2的幂次
const PERMISSIONS = {
READ: 1 << 0, // 1,二进制 0001,读权限
WRITE: 1 << 1, // 2,二进制 0010,写权限
DELETE: 1 << 2,// 4,二进制 0100,删除权限
ADMIN: 1 << 3 // 8,二进制 1000,管理员权限
};
权限判断
判断用户是否拥有某个权限,使用按位与运算。如果用户权限值和目标权限值按位与的结果等于目标权限值,说明用户拥有该权限:
/**
* 判断用户是否拥有指定权限
* @param {number} userPermissions 用户的权限值
* @param {number} permission 需要判断的权限值
* @returns {boolean} 是否拥有权限
*/
function hasPermission(userPermissions, permission) {
return (userPermissions & permission) === permission;
}
// 测试:用户拥有读和写权限,权限值为1|2=3
let userPerm = PERMISSIONS.READ | PERMISSIONS.WRITE;
console.log(hasPermission(userPerm, PERMISSIONS.READ)); // true
console.log(hasPermission(userPerm, PERMISSIONS.DELETE)); // false
添加权限
给用户添加某个权限,使用按位或运算,将用户权限值和目标权限值按位或即可:
/**
* 给用户添加指定权限
* @param {number} userPermissions 用户的权限值
* @param {number} permission 需要添加的权限值
* @returns {number} 添加后的权限值
*/
function addPermission(userPermissions, permission) {
return userPermissions | permission;
}
// 测试:原有用户权限为读权限,添加写权限
let userPerm2 = PERMISSIONS.READ;
userPerm2 = addPermission(userPerm2, PERMISSIONS.WRITE);
console.log(userPerm2); // 3,同时拥有读和写权限
console.log(hasPermission(userPerm2, PERMISSIONS.WRITE)); // true
移除权限
移除用户的某个权限,需要先对目标权限取按位非得到掩码,再和用户权限值做按位与运算:
/**
* 移除用户的指定权限
* @param {number} userPermissions 用户的权限值
* @param {number} permission 需要移除的权限值
* @returns {number} 移除后的权限值
*/
function removePermission(userPermissions, permission) {
return userPermissions & ~permission;
}
// 测试:用户原有读、写、删除权限,移除写权限
let userPerm3 = PERMISSIONS.READ | PERMISSIONS.WRITE | PERMISSIONS.DELETE;
userPerm3 = removePermission(userPerm3, PERMISSIONS.WRITE);
console.log(userPerm3); // 5,二进制0101,剩余读和删除权限
console.log(hasPermission(userPerm3, PERMISSIONS.WRITE)); // false
位运算权限设计的注意事项
使用位运算做权限设计时需要注意几个问题:
- JavaScript的位运算操作的是32位有符号整数,因此最多只能表示31个权限位(第32位是符号位),如果需要更多权限,可以结合多个32位数值或者使用BigInt类型。
- 权限值必须是2的幂次,否则会出现权限判断错误的情况,比如不能把权限定义为3,因为3的二进制是11,会和READ|WRITE的组合冲突。
- 位运算的优先级低于算术运算符,编写复杂逻辑时建议加上括号明确运算顺序,避免出错。
总的来说,JavaScript的Bitwise Operators在权限设计场景中非常实用,能够用极简的代码实现高效的权限管理逻辑,适合权限数量不多、对性能有一定要求的场景使用。
JavaScriptBitwise_Operators位运算权限设计二进制修改时间:2026-07-21 00:21:37