我在JavaScript中使用了这个非常有用且干净的小功能:
CreateGuid: function () {
var guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
return guid;
},
我想稍微修改它以便能够随机生成字母数字序列。
我不支持的这个功能的唯一部分是:
r : (r & 0x3 | 0x8)
除了这是一个三元运算符这是做什么的呢?
答案 0 :(得分:5)
如果你看一下0x3和0x8的二进制写法可能会更清楚:
0x3.toString(2) => 11
0x8.toString(2) => 1000
我们在这里做的是按位操作:
首先在位级and
11
(截断到最后两位,即%4
},
然后or
1000
(设置一位,添加8
)。
整体可能不那么容易直接写成
var guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
.replace(/x/g, function(){
return (Math.random()*16|0).toString(16)
})
.replace(/y/, function(){
return (Math.random()*4+8|0).toString(16)
})
答案 1 :(得分:2)
看起来相当于r % 4 + 8
0 & 0x3 | 0x8 = 8
1 & 0x3 | 0x8 = 9
2 & 0x3 | 0x8 = 10
3 & 0x3 | 0x8 = 11
4 & 0x3 | 0x8 = 8
5 & 0x3 | 0x8 = 9
6 & 0x3 | 0x8 = 10
7 & 0x3 | 0x8 = 11
8 & 0x3 | 0x8 = 8
9 & 0x3 | 0x8 = 9
10 & 0x3 | 0x8 = 10
11 & 0x3 | 0x8 = 11
12 & 0x3 | 0x8 = 8
13 & 0x3 | 0x8 = 9
14 & 0x3 | 0x8 = 10
15 & 0x3 | 0x8 = 11