JavaScript 中 GUID / UUID 函数的语法说明
Explanation of syntax on GUID / UUID Function in JavaScript
我对 JS 很陌生,正在研究生成 GUID / UUID 的代码。
这是我在这个 Whosebug 中找到的代码 question
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);
ie,根据要替换的当前字符的值(即 'x' 或 'y')使用 r
或 r | 0x3 | 0x8
作为当前位置的值.后者是因为 UUID 版本 4 的规范,某些位必须具有某些值。有关详细信息,请参阅 specs。
你可以将这一行重写如下
var v = 0;
if (c == 'x') v = r;
else v = r & 0x3 | 0x8
所以 v
仍然是 0 到 15 之间的值,然后用 v.toString(16)
转换为十六进制字符 (0 - f)
我对 JS 很陌生,正在研究生成 GUID / UUID 的代码。
这是我在这个 Whosebug 中找到的代码 question
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);
ie,根据要替换的当前字符的值(即 'x' 或 'y')使用 r
或 r | 0x3 | 0x8
作为当前位置的值.后者是因为 UUID 版本 4 的规范,某些位必须具有某些值。有关详细信息,请参阅 specs。
你可以将这一行重写如下
var v = 0;
if (c == 'x') v = r;
else v = r & 0x3 | 0x8
所以 v
仍然是 0 到 15 之间的值,然后用 v.toString(16)