&操作符及其在类型判断中的应用
前言
看到lodash里面居然有用到&操作符来进行类型判断,所以在这里记录一下。
&:将两个数值进行二进制对比,如果两个操作数对应的位置上都为1,则返回的该位置值为1,否则该位置值为0
例子
var a = 4; // 0100
var b = 9; // 1001
console.log(a & b); // 0 等价于0000
a = 5; // 0101
b = 3; // 0011
console.log(a & b); // 1 等价于0001
a = 6; // 0110
b = 3; // 0011
console.log(a & b); // 2 等价于0010
而在lodash中用来进行类型判断正是应用了二进制位数的特点配合&操作符相应位置相同才会返回1的特点。
首先需要使用那些两两之间不能都用1的值,而这个值结合二进制的特点其实非常好拿到。
如:
[
1, // 00001
2, // 00010
4, // 00100
8, // 01000
16, // 10000
// ...
]
看很明显2的倍数是不存在相应位置有重复的,所以你就可以如下改造你的代码:
旧:
const BEIJING = 'beijing';
const SHANGHAI = 'shanghai';
const GUANGZHOU = 'guangzhou';
const SHENZHEN = 'shenzhen';
const HANGZHOU = 'hangzhou';
function city(_city) {
var inBeijing = _city === BEIJING;
var inShanghai = _city === SHANGHAI;
var inGuangzhou = _city === GUANGZHOU;
var inShenzhen = _city === SHENZHEN;
var inHangzhou = _city === HANGZHOU;
// do something
}
新:
const BEIJING = 1;
const SHANGHAI = 2;
const GUANGZHOU = 4;
const SHENZHEN = 8;
const HANGZHOU = 16;
function city(_city) {
var inBeijing = _city & BEIJING;
var inShanghai = _city & SHANGHAI;
var inGuangzhou = _city & GUANGZHOU;
var inShenzhen = _city & SHENZHEN;
var inHangzhou = _city & HANGZHOU;
// do something
}
当然,我个人认为,只需了解就好,没有必要使用这种方式去控制变量进行判断,这除了加大项目复杂度,增加学习难度之外并没有什么好处。
想想接手你的代码的同学看到你写的&操作符,还要特地去了解这个知识点,并且其字段意思无法从其值得到提示,这样想,字符串的常量判断其实才是该用的常规手段罢。