项目开发过程中碰到了这样一段代码:
this.uuid = 'xxxxxxy_xxxx_xxxx_yxxx_xxxxxxxxxxxx'.replace(/[xy]/g,
function (c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
}).toUpperCase();
this.uuid=getCharacter("upper")+this.uuid;
起初看到的时候,对单竖杠运算符’|‘不太理解,于是就在网上搜了一下,搜到的答案就好像是一个人写的,都是只介绍说,单竖杠’|‘可以用来取整运算,只保留整数部分。然后具体的运算规则,统一都是再说单竖杠’|'是将两个数转成二进制数后相加得到的结果,并给出例子
console.log(3|4); //7
console.log(8|3);//11
console.log(4|4);//4
看到这里的时候,前两个用二进制相加是没有问题的,但是到’4|4’的时候,就让人不得其解了,因为二进制相加的4|4明明是8,怎么会是4;
3|4
011
100
----
111
3|4 = 7
8|3
1000
0011
-----
1011
8|3 = 11
4|4
100
100
----
1000
算到这里,4|4应该是为8,但是这浏览器执行的时候4|4为4
于是就觉得单竖杠’|‘会不会不是二进制相加的结果。于是我就去找了一下朋友问一下,朋友一语点醒梦中人,说单竖杠’|'并不是相加,而是二进制去位或,这样的解释的话,就不会有问题了。
首先,要知道位或的原理,即有一为一,全零为零
3|4
011
100
----
111
3|4 = 7
8|3
1000
0011
-----
1011
8|3 = 11
4|4
100
100
----
100
4|4 = 4
理到这里,才算浅浅明白单竖杠’|'的使用,记录下来,以防下次迷糊!