javascript - JavaScript 中 GUID/UUID 函数的语法解释
问题描述
我对 JS 很陌生,并且正在查看生成 GUID / UUID 的代码。
这是我在这个 Stackoverflow问题中找到的代码
function uuidv4() {
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);
});
}
console.log(uuidv4());
我遇到的问题是理解这种语法:
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
有人可以通过逐步解释它的作用来帮助我吗?
非常感谢您的支持。
问候
解决方案
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
是相同的
var r = Math.random() * 16 | 0;
即,在0-15(或十六进制的0-f)范围内创建一个不带小数位的随机数。你也可以把这一行写成
var r = Math.floor(Math.random() * 16)
但| 0
可能更快......而且
var v = c == 'x' ? r : (r & 0x3 | 0x8);
即,根据要替换的当前字符的值(即“x”或“y”)使用r
或r | 0x3 | 0x8
作为当前位置的值。后者是因为 UUID 版本 4 的规范,某些位必须具有某些值。有关详细信息,请参阅规格。
您可以按如下方式重写此行
var v = 0;
if (c == 'x') v = r;
else v = r & 0x3 | 0x8
所以v
仍然是一个介于 0 和 15 之间的值,然后将其转换为十六进制字符 (0 - f)v.toString(16)
推荐阅读
- mongodb - Mongodb分片,在所有分片上复制集合
- typescript - 从 Union 类型映射多个兼容类型
- sql - 通过分组将计数器添加到不同的行
- zend-framework - 访问层过滤器中逻辑的设置数据?
- python - 将主脚本中的变量和数据框导出到导入的脚本以供使用
- python - 无法加载 python 库
- python - pyspark - 过滤包含特殊字符集的行
- php - Wp-Cron cpanel作业崩溃网站-如何调试
- google-analytics - 无法访问 Google Analytics 中的属性设置
- angular - 带有条件运算符表达式的大括号文本插值中的 Angular 12 花括号