求助,这段生成uuid的函数没怎么理解
生成uuid的函数没懂
function guid() {
return '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);
});
}
这个为什么能将小数转换成整数
var r = Math.random()*16|0
这个是什么意思
r&0x3|0x8
这行怎么理解?
v = c == 'x' ? r : (r&0x3|0x8);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这并不是真的 UUID,只能说是个符合 UUID 标准格式的一个随机字符串。
这里面运用了很多位运算,需要你先有一定的 2 进制和 2 进制计算的基础知识。对于计算机相关专业的学生来说,大一下或大二上时这是必修课程内容;非科班出身的人,建议先恶补相关知识。
Math.random()
会生成一个[0, 1)
范围的随机小数,* 16
后范围即变为[0, 16)
。x | y
表示按位或运算。JS 中,位运算会先将操作数转化为 32bit 2 进制数,然后通过无符号右移、取整,最后再进行按位操作。所以一个数跟 0 做按位或操作,就等于截断小数部分取整了。x & y
表示按位和运算(也有翻译成按位与的,一个意思)。0x3
、0x8
在 JS 中表示 16 进制数,这里这两个数就相当于 10 进制的3
和8
;同理例如0xf
等于 10 进制的15
。x ? y : z
是三目运算符,即x
是 Truly 时返回y
、否则返回z
。number.toString(16)
表示将一个 Number 对象转换为 16 进制字符串。百科 - 位运算
&(与运算)、|(或运算)、^(异或运算)的本质理解
其他的,然后去远足
已经说的很好,我再说一下
这句其实限制了'y'转换出的数据是0x8,0x9,0xA,0xB这几种可能,估计是想做一个特殊的标记位。