💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 1. Number.isFinite(), Number.isNaN() ES6 在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法。 Number.isFinite()用来检查一个数值是否为有限的(finite),即不是Infinity。 ~~~ Number.isFinite(15); // true Number.isFinite(0.8); // true Number.isFinite(NaN); // false Number.isFinite(Infinity); // false Number.isFinite(-Infinity); // false Number.isFinite('foo'); // false Number.isFinite('15'); // false Number.isFinite(true); // false ~~~ 注意,如果参数类型不是数值,Number.isFinite一律返回false。 Number.isNaN()用来检查一个值是否为NaN。 ~~~ Number.isNaN(NaN) // true Number.isNaN(15) // false Number.isNaN('15') // false Number.isNaN(true) // false Number.isNaN(9/NaN) // true Number.isNaN('true' / 0) // true Number.isNaN('true' / 'true') // true ~~~ 如果参数类型不是NaN,Number.isNaN一律返回false。 它们与传统的全局方法isFinite()和isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,**Number.isFinite()对于非数值一律返回false, Number.isNaN()只有对于NaN才返回true,非NaN一律返回false。** ~~~ isFinite(25) // true isFinite("25") // true Number.isFinite(25) // true Number.isFinite("25") // false isNaN(NaN) // true isNaN("NaN") // true Number.isNaN(NaN) // true Number.isNaN("NaN") // false Number.isNaN(1) // false Number.parseInt(), Number.parseFloat() ~~~ ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。 ~~~ // ES5的写法 parseInt('12.34') // 12 parseFloat('123.45#') // 123.45 // ES6的写法 Number.parseInt('12.34') // 12 Number.parseFloat('123.45#') // 123.45 ~~~ 这样做的目的,是逐步减少全局性方法,使得语言逐步模块化。 ~~~ Number.parseInt === parseInt // true Number.parseFloat === parseFloat // true Number.isInteger() Number.isInteger()用来判断一个数值是否为整数。 Number.isInteger(25) // true Number.isInteger(25.1) // false ~~~ JavaScript 内部,整数和浮点数采用的是同样的储存方法,所以 25 和 25.0 被视为同一个值。 ~~~ Number.isInteger(25) // true Number.isInteger(25.0) // true ~~~ 如果参数不是数值,Number.isInteger返回false。 ~~~ Number.isInteger() // false Number.isInteger(null) // false Number.isInteger('15') // false Number.isInteger(true) // false ~~~ 注意,由于 JavaScript 采用 IEEE 754 标准,数值存储为64位双精度格式,数值精度最多可以达到 53 个二进制位(1 个隐藏位与 52 个有效位)。如果数值的精度超过这个限度,第54位及后面的位就会被丢弃,这种情况下,Number.isInteger可能会误判。 `Number.isInteger(3.0000000000000002) // true` 上面代码中,Number.isInteger的参数明明不是整数,但是会返回true。原因就是这个小数的精度达到了小数点后16个十进制位,转成二进制位超过了53个二进制位,导致最后的那个2被丢弃了。 类似的情况还有,如果一个数值的绝对值小于Number.MIN_VALUE(5E-324),即小于 JavaScript 能够分辨的最小值,会被自动转为 0。这时,Number.isInteger也会误判。 ~~~ Number.isInteger(5E-324) // false Number.isInteger(5E-325) // true ~~~ 上面代码中,5E-325由于值太小,会被自动转为0,因此返回true。 总之,如果对数据精度的要求较高,不建议使用Number.isInteger()判断一个数值是否为整数。