判定权限的场景下,如果给每个权限设置一个标识,后续判断会相当复杂。
const CREATE = 1
const DELETE = 2
const UPDATE = 3
const DETAIL = 4
不同用户的权限种类以及数量均不同,权限间各种组合的范围过大,不利于表达用户权限。
此时可以通过四位二进制表达是否拥有某项权限。
const CREATE = 0b0001
const DELETE = 0b0010
const UPDATE = 0b0100
const DETAIL = 0b1000
在声明用户权限时,只需要二进制的或运算(上下两位任意为1则为1)。
const permissions = CREATE | DETAIL
console.log(permissions.toString(2)) // 1001
在判断权限时,使用且运算(上下两位均为1则为1),所以当用户有该权限的话,用户权限 & 单个权限 === 单个权限。
const CREATE = 0b0001
const DELETE = 0b0010
const UPDATE = 0b0100
const DETAIL = 0b1000
const permissions = CREATE | DETAIL
console.log(permissions.toString(2)) // 1001
const hasPermission = (permissions & DETAIL) === DETAIL
console.log(hasPermission) // true
const hasPermission1 = (permissions & DELETE) === DELETE
console.log(hasPermission1) // false
当需要从总权限中,删除某一权限,只需要进行 -运算。
const permissions = CREATE | DETAIL
console.log(permissions.toString(2)) // 1001
const res = permissions - CREATE
console.log(res.toString(2)) // 1000
React中的fiberflex就是这么操作的,每一个fiber都会有后续操作的标记,如:替换、更新、删除…