【问题标题】:Understanding Javascript Function in base 16了解 base 16 中的 Javascript 函数
【发布时间】:2014-08-03 21:19:03
【问题描述】:

我在 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)

除了它是一个三元运算符之外还有什么作用?

【问题讨论】:

标签: javascript hex


【解决方案1】:

如果你看一下 0x3 和 0x8 的二进制写入可能会更清楚:

 0x3.toString(2) => 11
 0x8.toString(2) => 1000

我们在这里做的是按位运算:

  • 第一个and11 在位级别(仅截断到最后两个位,即%4),

  • 然后是or1000(设置一位,添加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)
})

【讨论】:

  • 在我看来 Math.random()*16|0 === 16 偶尔应该是正确的,假设单管道严格截断小数位。然而,我跑了这个 100m x 10 次,但它从来都不是真的。 Math.random()*4+8|0 === 12 也一样。这是预期的吗?我疯了吗?附言感谢您提供“不那么混乱”的选项。这将帮助未来的开发人员不再讨厌我,我一直很感激!
  • @beez Math.random()[0-1[ 中。不可能是 1。所以Math.random()*16[0-15[ 中。不可能是 16 岁。
  • 糟了!实时调频。来自MDNThe Math.random() function returns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range. 谢谢@dystroy!
【解决方案2】:

看起来相当于r % 4 + 8

http://jsfiddle.net/8TFMg/1/

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

【讨论】:

  • 是的,它似乎只是循环通过 8,9,10,11 并将它们插入到字符串中的 y 点:P
猜你喜欢
  • 1970-01-01
  • 2011-11-11
  • 2014-11-22
  • 2014-05-27
  • 2022-01-17
  • 1970-01-01
  • 2012-11-15
  • 2013-03-05
  • 2020-05-23
相关资源
最近更新 更多