前端于我
记录 / js / lodash

&操作符及其在类型判断中的应用

前言

看到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
}

当然,我个人认为,只需了解就好,没有必要使用这种方式去控制变量进行判断,这除了加大项目复杂度,增加学习难度之外并没有什么好处。

想想接手你的代码的同学看到你写的&操作符,还要特地去了解这个知识点,并且其字段意思无法从其值得到提示,这样想,字符串的常量判断其实才是该用的常规手段罢。

发表于: 2019-11-11