基于Boolean状态的多属性场景(对象在某几个并列的属性上,具有Boolean值状态),可以考虑使用位运算。
比如开关类的场景。
角色的案例
比如一个用户可能有多个角色,我们想判断他是不是某个角色的时候,就能用位运算来处理。
假设我们做了如下这个设定:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| const ROLE_GUEST = 0; const ROLE_DEVELOPER = 2; const ROLE_DESIGNER = 4; const ROLE_PRODUCTER = 8;
class People{ constructor() { this.role = ROLE_GUEST; this.printBitCode(); } addRole(role) { this.role |= role; this.printBitCode(); } deleteRole(role) { this.role &= ~role; this.printBitCode(); } isRole(role) { return this.role & role; }
printBitCode() { console.log(this.role.toString(2)); } }
function isDeveloper(people) { if (people.isRole(ROLE_DEVELOPER)) { console.log("张三是个开发人员"); } else { console.log("张三不是开发人员"); } }
const people = new People(); isDeveloper(people);
console.log("给张三添加开发人员的角色"); people.addRole(ROLE_DEVELOPER); isDeveloper(people);
console.log("删除张三开发人员的角色"); people.deleteRole(ROLE_DEVELOPER); isDeveloper(people);
|
可以看到输入结果如下:
1 2 3 4 5 6 7 8
| 0 张三不是开发人员 给张三添加开发人员的角色 10 张三是个开发人员 删除张三开发人员的角色 0 张三不是开发人员
|
但是这有个弊端,就是如果数据是存储在数据库中的,你想根据角色查询用户的话,需要采用位运算,比如查询开发人员列表,就需要这样写:
1
| select name, role from user where role & 2;
|
我不确定这样多了运算,对于性能的影响有多大,待测试。
资料
位运算介绍:
https://www.cnblogs.com/tinys-top/p/11648535.html