es6中Number.parseInt和Math.trunc使用和功能上有什么区别吗?

在MDN上两个函数的解释分别为:

Math.trunc() 方法会将数字的小数部分去掉,只保留整数部分
parseInt() 函数解析一个字符串参数,并返回一个指定基数的整数 (数学系统的基础)。

写了一点测试代码:

console.log(Number.parseInt(-1.20));
console.log(Math.trunc(-1.20));
console.log(Number.parseInt(100.20));
console.log(Math.trunc(100.20));
console.log(Number.parseInt('中文'));
console.log(Math.trunc('中文'));

运行结果完全一致:

clipboard.png

查了一下各自的api,Number.parseInt功能上完全覆盖Math.trunc,ES6中增加这个Math.trunc有什么用?

阅读 5.1k
2 个回答

在数字极大或是极小时候,会自动采用科学计数法时候,parseInt是会有问题的。

console.log(parseInt(6.022e23)); // 6
console.log(Math.trunc(6.022e23)); // 6.022e+23

虽然功能上可能对于部分结果一致,但是其作用是不一样的。
parseInt在实际运用上经常会出一些问题,比如0X或是0开头就会出现解析为十六进制或八进制的问题,虽然你可能本意是转换为十进制,但是后端传递值或是用户输入并不会和你想象的一样。
Math.trunc在ES6更多的是为了补足floor,round,ceil这一系列的方法,以及可想而知,在Math.trunc适用的领域,其性能会比parseInt好不少。

从另外一个角度上来说,如果给你一个能够完成所有功能的函数,但是需要传递很多不同参数,或是命名功能分类清晰的多种函数,去完成一个项目,你会选择哪种呢?
个人而言绝对选择是后一种。

简单的说,parseInt() 主要用于将字符串转换成整数,所以哪怕目标本身就是一个数,也极有可能是先转换成字符串再来处理的,这也能解释科学计数法的结果

Math.trunc 是直接对数值进行处理,理论上来说会快一些也更准确一些。可惜有些浏览器不支持。所以现在用 Math.floor 的比较多,但是要注意处理负数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏