Math.random()* i |是什么0意味着?

时间:2016-05-26 23:50:31

标签: javascript

var lst = [/*List of items*/];
for (var i = 10; i > 0; i--) {
    lst.appendChild(lst[Math.random() * i | 0]);
}

为什么会“|”在一个索引?这个函数是否会将列表'lst'洗牌?

2 个答案:

答案 0 :(得分:7)

bitwise OR operator |将其输入转换为32位二进制数。这通常用于快速舍入为零(比Math.trunc()快):

req.query

表达式console.log(1.1 | 0); // 1 console.log(1.9 | 0); // 1 console.log(-1.1 | 0); // -1 console.log(-1.9 | 0); // -1因此等于Math.random() * i | 0并返回0到i-1范围内的伪随机整数。

PS:双按位否定~~具有相同的效果。请记住,应用按位运算符可以有效地减少整数操作数的范围,从Number.MAX_SAFE_INTEGER(2⁵³ - 1)到最大32位二补码(2³¹ - 1)。

答案 1 :(得分:1)

Math.random()为您提供范围[0, 1)中的随机浮点数。将它乘以i in循环可以得到奇怪的值。 | 0为您提供值的整数部分。 Math.floor(Math.random()*n)会返回范围[0, n)中的随机整数,这似乎是适用的。

  

Node.appendChild()方法将节点添加到指定父节点的子节点列表的末尾。

  

如果给定的子节点是对文档中现有节点的引用,则appendChild()将其从当前位置移动到新位置

所以你只需重新洗牌前10个节点,在列表的末尾放置一个随机的节点。