node后端项目中权限切分的思路分享
场景
在编写权限控制模块时,如果将单个权限用简单的数字代替,那么在权限组合是我们就需要去考虑多种情况,如下:
js
const READ = 1
const WRITE = 2
const UPDATE = 3
const DELETE = 4
// 那么同时拥有读写权限的情况,我们就要定义一个新的常量
const READ&WRITE = 5
// ....
// 这样效率极低,且很可能出错
解决思路
利用学习过,但不经常使用的按位或运算就可以很简单的解决这个问题
js
const READ = 0x1 // 0001
const WRITE = 0x10 // 0010
const UPDATE = 0x100 // 0100
const DELETE = 0x1000 // 1000
// 同时拥有读写权限的情况,我们只需要进行与运算即可
console.log((READ | WRITE).toString(2)) // 0011
简单回顾
位操作符
ECMAScript中所有数值都以 IEEE 754 64位格式存储,但是位运算符会先把值转换为32位整数,在进行位操作,之后再把结果转换为64位。
有符号整数使用前31位表示整数值,第32位表示符号(0为正,1为负)。如果一个位是空的,用0代替
按位非
按位非操作符用波浪符(~)表示,它的作用是返回数值的一补数。按位非是ECMAScript中为数不多的几个二进制数学操作符之一。
js
let num1 = 25 // 二进制 00000000000000000000000000011001
let num2 = ~num1 // 二进制 11111111111111111111111111100110
console.log(num2) // -26
按位非的最终效果是对数值取反并减1
js
// 上面的代码等价于
let num1 = 25
let num2 = -num1 - 1
console.log(num) // 26
按位与
按位与操作符用和号(&)表示,有两个操作数
本质上,按位与就是将两个数的每一个位补齐,然后基于真值表中的规则,对每一位执行相应的与操作
第一个数值的位 | 第二个数值的位 | 结果 |
---|---|---|
1 | 1 | 0 |
1 | 0 | 0 |
0 | 0 | 0 |
0 | 1 | 0 |
两个都为1才为1,遇到0必为0
看下例子:
js
let result = 25 & 3
// 11001(25)
// 00011(3)
// 00001(1)
console.log(result) //1
按位或
按位或操作符用管道符(|)表示,同样有两个操作符。按位或遵循下列如下真值表:
第一个数值的位 | 第二个数值的位 | 结果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
至少有一位有1时候返回1,其余时候返回0
按位异或
按位异或用脱字符(^)表示,同样有两个操作数。下面是按位异或的真值表
第一个数值的位 | 第二个数值的位 | 结果 |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
它只在一位上是1的时候返回1(两位都是0或1时候,返回0)