2017-09-14 56 views
2

我一直在使用具有某种功能的遗留代码,它应该为数组返回一个随机项,而我看到下面的表达式:“Math.random()* arr.length | 0”如何为数组返回一个随机索引

array[Math.random() * arr.length | 0] 

我的第一印象是尝试已了解the | operator,但我无法弄清楚如何做的工作。 我测试的铬控制台中的表达,我看到总是返回与此有效的索引:

let array = [1,2,3,4] 
for(let i = 0; i < 5000; i++){ 
    console.log(array[Math.random() * arr.length | 0]); 
} 

“的Math.random()* arr.length | 0”是如何工作的回报,随机指数数组?

回答

4
  • Math.random()返回一个数> = 0和1。<
  • * arr.length返回一个数> = 0和< arr.length,然而这不能被用作指标,因为它会有一个小数部分
  • | 0强制左表达式一个整数,然后应用按位或数为零,这始终是对方号码

此说,是什么让这部作品是在运营商|隐式转换(称为coersion)。

+1

哦!它只是一个黑客coerse int整数!谢谢! –

+1

Yeap,实际上,最好使用'Math.trunc()'来代替,意图更清晰。 –

+0

是的,我会用它。感谢您的建议。 –

2

在这种情况下,| 0被用于舍入到最接近的整数。所以Math.random生成的数字范围为0 < =数字< 1,那么这将乘以arr.length,给出一个介于0 < = number < arr.length之间的数字,然后向下舍入为0和arr之间的整数。长度-1,包容

相关问题