javascript中按位与(&)用于权限校验:判断单权限用userperms & read !== 0,排除权限需配合~如userperms &= ~admin,验证多权限须用(userperms & (read | write)) === (read | write),截断高位用userperms & 0xff。

JavaScript 中按位与运算符(&)本身不直接“过滤”,而是用于校验或提取特定权限位。所谓“过滤权限”,实际是指:判断某权限是否存在、排除某权限、或保留一组指定权限——这些操作都依赖 & 配合其他位运算符(如 ~)协同完成。
用 & 判断是否拥有某项权限
这是最基础也最常用的场景。每个权限对应一个 2 的幂(如 READ = 1、WRITE = 2、DELETE = 4),确保二进制中仅一位为 1。
-
userPerms & READ结果非零 → 用户有读权限 -
userPerms & DELETE结果为 0 → 用户没有删除权限 - 注意:不能写成
(userPerms & READ) === true,应写成!!(userPerms & READ)或(userPerms & READ) !== 0
用 & 和 ~ 联合实现“排除某权限”
想从当前权限集中移除某个权限(比如去掉 ADMIN),本质是把对应位清零。单靠 & 不行,必须搭配取反 ~ 构造掩码:
const ADMIN = 8; // 0b1000userPerms = userPerms & ~ADMIN;- 解释:
~ADMIN得到一个除第 4 位外全为 1 的掩码(如~8 → ...11110111),再与原值&,就能安全清零该位,其余位保持不变
用 & 验证是否同时具备多个权限
要确认用户是否“同时拥有读+写”,不能链式写 userPerms & READ & WRITE(这会先算 userPerms & READ,再和 WRITE 做与,逻辑错误)。
- 正确写法:
(userPerms & (READ | WRITE)) === (READ | WRITE) - 原理:先用
|合并目标权限(得到一个多位为 1 的掩码),再用&提取用户实际拥有的这部分位,最后比对是否完全一致 - 若只需“至少有一个”,则写成:
!!(userPerms & (READ | DELETE))
用 & 提取低 N 位做权限截断(边界防护)
当权限值可能超出设计范围(比如只定义了前 8 种权限),可用 & 加掩码强制保留有效位:
- 假设最多支持 8 种权限(即 bit0–bit7),掩码为
0xFF(0b11111111) -
userPerms = userPerms & 0xFF;→ 自动丢弃高位,防止越界权限被误判 - 类似地,提取低 4 位:
n & 0b1111或n & 15
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











