在处理数值的时候,获取浮点数的整数和小数部分,是一种常见的操做,在JavaScript中有许多方法能够达到目的,但也正由于方法众多,因此哪一种方法更好,也值得咱们仔细研究一番。jsp
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。测试
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
console.log(Math.trunc(3.75)); // 3 console.log(Math.trunc(-3.75)); // -3
具体实现原理,请参考 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.comip