ES6数值的扩展

98 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天juejin.cn/post/712312…

注意:Number里面的方法都不会进行隐私转换,'15'字符串15,进行判断也会是false

1.检索该数值是否为有限数

语法:Number.isFinite(数值)

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

注意:所有参数类型不是数值,一律返回false,不会进行隐式转换。

2. 检索该数值是不是NaN

语法:Number.isNaN(数值)

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,一律返回false.

前两种方法在ES5里是window的方法,用在window上,会进行隐士转换,在Number上不会。

3. 取整数

语法:Number.parseInt(数值);

4. 取浮点数(小数);

语法:Number.parFloat(数值);

3、4方法是把全局方法的移动到Number上,用法与以前一致。

5. 判断一个数是否为整数。如果参数不是数值,Number.isInteger返回false

语法:Number.inInteger(数值);

  • JavaScript 内部,整数和浮点数采用的是同样的储存方法,所以 25 和 25.0 被视为同一个值。
  • 注意,由于 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()判断一个数值是否为整数。

6. 安全整数和Number.isSafeInteger();

在-253~253之间的数(不包含两端),的数都叫做安全数。

ES6里新增的第八种基本数据类型

BigInt大整数

创建方式:const a=12342345678n;在创建时,后面带个字母n

为了与 Number 类型区别,BigInt 类型的数据必须添加后缀n。 BigInt的转换规则与Number一致。

BigInt(123) // 123n
BigInt('123') // 123n
BigInt(false) // 0n
BigInt(true) // 1n

BigInt()函数必须有参数,而且参数必须可以正常转为数值,下面的用法都会报错。

new BigInt() // TypeError
BigInt(undefined) //TypeError
BigInt(null) // TypeError
BigInt('123n') // SyntaxError
BigInt('abc') // SyntaxError

参数如果是小数,也会报错。

BigInt和Number完全是两种不同的类型,如果42n===42,结果为false;

**是指数运算,就是Math.pow次幂。

BigInt只能和自己的类型做运算,不能和number进行运算