var lst = [/*List of items*/];
for (var i = 10; i > 0; i--) {
lst.appendChild(lst[Math.random() * i | 0]);
}
为什么会“|”在一个索引?这个函数是否会将列表'lst'洗牌?
答案 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个节点,在列表的末尾放置一个随机的节点。