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')使用 rr | 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)