Skip to content

运算操作 ​

本节目标:理解“运算操作”的核心思路,并能把它用于实际开发或面试表达。 BigInt 类型的+、-、*和**这四个二元运算符,与 Number 类型的行为一致。 除法运算/会舍去小数部分,返回一个整数。 9n / 5n// 1n

注意: 一、几乎所有的数值运算符都可以用在 BigInt,但是有两个例外。

不带符号的右移位运算符>>>
一元的求正运算符+

上面两个运算符用在 BigInt 会报错。前者是因为>>>运算符是不带符号的,但是 BigInt 总是带有符号的,导致该运算无意义,完全等同于右移运算符>>。后者是因为一元运算符+在 asm.js 里面总是返回 Number 类型,为了不破坏 asm.js 就规定+1n会报错。

二、BigInt 不能与普通数值进行混合运算。 1n + 1.3 // 报错 上面代码报错是因为无论返回的是 BigInt 或 Number,都会导致丢失精度信息。比如(2n**53n + 1n) + 0.5这个表达式,如果返回 BigInt 类型,0.5这个小数部分会丢失;如果返回 Number 类型,有效精度只能保持 53 位,导致精度下降。

三、同样的原因,如果一个标准库函数的参数预期是 Number 类型,但是得到的是一个 BigInt,就会报错。 // 错误的写法Math.sqrt(4n) // 报错 // 正确的写法Math.sqrt(Number(4n)) // 2 上面代码中,Math.sqrt的参数预期是 Number 类型,如果是 BigInt 就会报错,必须先用Number方法转一下类型,才能进行计算。 asm.js 里面,|0跟在一个数值的后面会返回一个32位整数。根据不能与 Number 类型混合运算的规则,BigInt 如果与|0进行运算会报错。 1n | 0 // 报错

BigInt 对应的布尔值,与 Number 类型一致,即0n会转为false,其他值转为true。
if (0n) {  console.log('if');} else {  console.log('else');}// else
上面代码中,0n对应false,所以会进入else子句。

比较运算符(比如>)和相等运算符(==)允许 BigInt 与其他类型的值混合计算,因为这样做不会损失精度。 0n < 1 // true0n < true // true0n == 0 // true0n == false // true0n === 0 // false BigInt 与字符串混合运算时,会先转为字符串,再进行运算。 '' + 123n // "123"

本站总访问 — 次