数值扩展
- 二进制和八进制表示法
- ES6 分别用前缀0b(或0B)和0o(或0O)表示二进制和八进制数值。
- Number对象上新增方法
- Number.isFinite():检查一个数值是否为有限的(finite),即不是Infinity。
- Number.isNaN():用来检查一个值是否为NaN。
- 与传统的全局方法isFinite()和isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数 值,再进行判断,而这两个新方法只对数值有效,Number.isFinite()对于非数值一律返回false, Number.isNaN()只有对于NaN才返回true,非NaN一律返回false。
- Number.parseInt(),Number.parseFloat():ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。
- Number.isInteger():判断一个数是否为整数。
- JavaScript 内部,整数和浮点数采用的是同样的储存方法,25和25.0被视为同一个值
- 参数不是数值的话直接返回false
- 对数据精度要求较高就不适合用Number.isInteger()判断一个数值是否为整数。比如会出现:Number.isInteger(3.0000000000000002) // true
- Number.EPSILON,一个常量,表示 1 与大于 1 的最小浮点数之间的差。实际上就是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了,可以认为两者是相等的。
- 比如:0.1 + 0.2 === 0.3 // false 因为0.1 + 0.2 // 0.30000000000000004
- console.log(0.1+0.2 === 0.3) //false
console.log(0.1+0.2-0.3 < Number.EPSILON) //true
- Number.isSafeInteger()
- 安全整数:JavaScript 能够准确表示的整数范围在-253 和 253之间(不含两个端点)超过这个范围无法精确表示这个值。ES6 引入Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER这两个常量,用来表示这个范围的上下限。
- Number.isSafeInteger()则是用来判断一个整数是否落在这个范围之内。
- 实际使用这个函数时,需要注意。验证运算结果是否落在安全整数的范围内,不要只验证运算结果,而要同时验证参与运算的每个值。
- Math的扩展
- Math.trunc():去除一个数的小数部分,返回整数部分。
- 对于非数值,首先将其转为数值
- 对于空值和无法截取整数的值返回NaN
- Math.sign():用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。对于那些无法转为数值的值,会返回NaN
- 参数为正数,返回+1;
参数为负数,返回-1;
参数为 0,返回0;
参数为-0,返回-0;
其他值,返回NaN。
- 参数为正数,返回+1;
- Math.cbrt():用于计算一个数的立方根。对于非数值,Math.cbrt()方法内部也是先使用Number()方法将其转为数值。
- Math.clz32():将参数转为 32 位无符号整数的形式然后返回这个 32 位值里面有多少个前导 0。对于空值或其他类型的值,Math.clz32方法会将它们先转为数值,然后再计算。
- 对于小数只考虑整数部分
- 左移运算符(<<)与Math.clz32方法直接相关。
- Math.imul():返回两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位的带符号整数。之所以需要部署这个方法,是因为 JavaScript 有精度限制,超过 2 的 53 次方的值无法精确表示。这就是说,对于那些很大的数的乘法,低位数值往往都是不精确的,Math.imul方法可以返回正确的低位数值。
- Math.fround():返回一个数的32位单精度浮点数形式。
- Math.hypot():返回所有参数的平方和的平方根。如果参数不是数值,Math.hypot方法会将其转为数值。只要有一个参数无法转为数值,就会返回 NaN。
- 新增4个对数相关方法
- Math.expm1():返回 ex - 1,即Math.exp(x) - 1。
- Math.log1p():Math.log1p(x)方法返回1 + x的自然对数,即Math.log(1 + x)。如果x小于-1,返回NaN。
- Math.log10():返回以 10 为底的x的对数。如果x小于 0,则返回 NaN。
- Math.log2():返回以 2 为底的x的对数。如果x小于 0,则返回 NaN。
- 新增 6 个双曲函数方法。
- Math.sinh(x) 返回x的双曲正弦(hyperbolic sine)
- Math.cosh(x) 返回x的双曲余弦(hyperbolic cosine)
- Math.tanh(x) 返回x的双曲正切(hyperbolic tangent)
- Math.asinh(x) 返回x的反双曲正弦(inverse hyperbolic sine)
- Math.acosh(x) 返回x的反双曲余弦(inverse hyperbolic cosine)
- Math.atanh(x) 返回x的反双曲正切(inverse hyperbolic tangent)
- Math.trunc():去除一个数的小数部分,返回整数部分。
- 指数运算符
- ES2016新增了一个指数运算符(**),这个运算符的一个特点是右结合,而不是常见的左结合。多个指数运算符连用时,是从最右边开始计算的。
- BigInt
- BigInt数据类型出现的原因:
- 数值的精度只能到 53 个二进制位(相当于 16 个十进制位),大于这个范围的整数,JavaScript 是无法精确表示的。
- 大于或等于2的1024次方的数值,JavaScript 无法表示,会返回Infinity。
- ES2020引入BigInt这一新的数据类型,只用来标识整数,没有位数的限制,任何位数的整数都可以精确表示。
- 与Number区别,必须添加后缀n,而且与普通整数是两种值。 42n === 42 // false
- 同样可以使用各种进制表示,都要加上后缀n 比如:0b1101n // 二进制
- typeof运算符对于 BigInt 类型的数据返回bigint。
- 可以使用负号(-),但是不能使用正号(+)
- BigInt对象
- 可以用作构造函数生成 BigInt 类型的数值。BigInt()构造函数必须有参数,而且参数必须可以正常转为数值,尤其注意字符串‘123n’是无法解析成Number的,参数小数也会报错。
- BigInt.prototype.toString()
- BigInt.prototype.valueOf()
- BigInt.asUintN(width, BigInt): 给定的 BigInt 转为 0 到 2width - 1 之间对应的值。
- BigInt.asIntN(width, BigInt):给定的 BigInt 转为 -2width - 1 到 2width - 1 - 1 之间对应的值。
- BigInt.parseInt(string[, radix]):近似于Number.parseInt(),将一个字符串转换成指定进制的 BigInt。
- 可以用作构造函数生成 BigInt 类型的数值。BigInt()构造函数必须有参数,而且参数必须可以正常转为数值,尤其注意字符串‘123n’是无法解析成Number的,参数小数也会报错。
- 类型转换
- 可以使用Boolean()、Number()和String()这三个方法,将 BigInt 可以转为布尔值、数值和字符串类型。取反运算符(!)也可以将 BigInt 转为布尔值。注意:String(1n) // “1” n会消失
- 数学运算
- BigInt 类型的+、-、*和**这四个二元运算符,与 Number 类型的行为一致。除法运算/会舍去小数部分,返回一个整数。比如:9n / 5n //1n
- 几乎所有的数值运算符都可以用在 BigInt,但是有两个例外。
- 不带符号的右移位运算符>>>
- 一元的求正运算符+
- BigInt 不能与普通数值进行混合运算。比如常见的错误,如果一个标准库函数的参数预期是 Number 类型,但是得到的是一个 BigInt,就会报错。Math.sqrt(4n) // 报错
- 其他运算
- BigInt 对应的布尔值,即0n会转为false,其他值转为true。
- 比较运算符(比如>)和相等运算符(==)允许 BigInt 与其他类型的值混合计算
- BigInt 与字符串混合运算时,会先转为字符串,再进行运算。比如:’’ + 123n // “123”
- BigInt数据类型出现的原因: