你不知道的取數值整數部分的冷知識

在處理數值的時候,獲取浮點數的整數和小數部分,是一種常見的操做,在JavaScript中有許多方法能夠達到目的,但也正由於方法衆多,因此哪一種方法更好,也值得咱們仔細研究一番。jsp

1. parseInt

let num = 3.75;
console.log(parseInt(num)); // 3
num = -3.75;
console.log(parseInt(num)); // -3

parseInt(3.75),會先將3.75轉換成字符串"3.75", 而後在轉換成3.
這個方法是一個將字符串轉換爲整數的方法,若是參數不是一個字符串,則將其轉換成字符串,性能開銷大。
關鍵還有一個致命的問題:性能

console.log(parseInt(0.00000001));  // 1
console.log(parseInt(1000000000000000000000)); // 1

分析:
這是由於toString(),0.00000001.toString()===1e-8而1000000000000000000000..toString() === 1e+21。測試

2. Math.ceil + Math.floor

Math.ceil() 向上取整

Math.floor() 向上取整

function trunc (num) {
    if (num>=0) {
        return Math.floor(num)
    } else {
        return Math.ceil(num)
    }
}
console.log(trunc(3.75));  // 3
console.log(trunc(-3.75)); // -3

使用Math.round和Math.ceil實現trunc方法,要比使用parseInt的性能好,由於省去了轉字符串。咱們能夠用jsperf測一下:spa

3. Math.trunc()

console.log(Math.trunc(3.75));    // 3
console.log(Math.trunc(-3.75));   // -3

4. |

具體實現原理,請參考 ECMA-262文檔code

log(3.75 | 0);    // 3
console.log(-3.75 | 0);   // -3

注意:
由於bitwise操做將操做數轉爲Int32,因此它不能處理超過32位的數值取整,而JavaScript有效整數的範圍是53位。blog

const num = 17179869184.89;
console.log(num | 0); // 0
console.log(Math.trunc(num)); // 17179869184

綜上: 因此若是要考慮壓縮代碼的大小,且明確知道數值範圍不會超過32位整數的時候,能夠考慮使用 | 0取整。不然,仍是使用Math方法吧。圖片

附: 性能測試 https://jsperf.com
圖片描述ip

相關文章
相關標籤/搜索