出题
一个对象上有多种 flag
比如: 他可以是硬的(hard) 也可以是红色的(red) 也可以是长的(long)
问 如何用程序表示
以及如何对 flag做‘增删查’
代码: 对象(硬的、长的)
增加: 对象(硬的、红色、长的)
删除:对象(硬的、红色)
查: 对象(硬的、红色) -> 对象是不是硬的 -> 是的
- 提示一下; 除了用数组的方式实现; 还可以思考一下用位运算的方式实现;
const enum Flags {
HARD = 1,
LONG = 1 << 1,
RED = 1 << 2,
}
class FlagObj {
private _flags = 0b0;
constructor() {}
hasFlag(flag: Flags) {
return !!(this._flags & flag);
}
addFlag(flag: Flags) {
return (this._flags = this._flags | flag);
}
delFlag(flag: Flags) {
if (this.hasFlag(flag)) {
return (this._flags = this._flags ^ flag);
}
}
}
const flag = new FlagObj();
console.log("---new FlagObj---");
console.log("HARD-->", flag.hasFlag(Flags.HARD));
console.log("LONG-->", flag.hasFlag(Flags.LONG));
console.log("RED-->", flag.hasFlag(Flags.RED));
flag.addFlag(Flags.HARD);
console.log("---addFlag(Flags.HARD)---");
console.log("HARD-->", flag.hasFlag(Flags.HARD));
console.log("LONG-->", flag.hasFlag(Flags.LONG));
console.log("RED-->", flag.hasFlag(Flags.RED));
flag.addFlag(Flags.LONG);
console.log("---addFlag(Flags.LONG)---");
console.log("HARD-->", flag.hasFlag(Flags.HARD));
console.log("LONG-->", flag.hasFlag(Flags.LONG));
console.log("RED-->", flag.hasFlag(Flags.RED));
flag.addFlag(Flags.HARD);
console.log("---addFlag(Flags.HARD)---");
console.log("HARD-->", flag.hasFlag(Flags.HARD));
console.log("LONG-->", flag.hasFlag(Flags.LONG));
console.log("RED-->", flag.hasFlag(Flags.RED));
flag.delFlag(Flags.LONG);
console.log("---delFlag(Flags.LONG)---");
console.log("HARD-->", flag.hasFlag(Flags.HARD));
console.log("LONG-->", flag.hasFlag(Flags.LONG));
console.log("RED-->", flag.hasFlag(Flags.RED));
备注:二进制前缀为0b,因此new FlagObj() 产生的对象里记录状态地私有属性初始状态为 0b0 也就是000,枚举类型中每一个对应一个二进制数,例如: 硬的001、长的010、红的100
- 此题出自“[崔学社]”群消息(github.com/cuixiaorui/)