2017-09-14 147 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,包容

相關問題