一、bigint是什么
bigint类型是ES11提供的一个新的数据类型,由于number类型只能在[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]范围内是安全的,超出了这个范围,精度会丢失,所以bigint出现了,表示任意大的整数。
二、如何定义bigint
1、在数字后加上n
const num = 1n
console.log(typeof num) // bigint
console.log(Object.prototype.toString.call(num)) // [object BigInt]
2、使用Bigint函数
Bigint函数中传的必须是整数值或者字符串类型的整数值
const num = BigInt('1')
console.log(typeof num) // bigint
console.log(Object.prototype.toString.call(num)) // [object BigInt]
三、bigint和number的区别
1、不能使用Math中的方法,Math仅用于number类型,不支持bigint
Math.ceil(1.2) // 2
Math.ceil(BigInt(1)) // 报错
2、不能和number混合运算,必须要转换成同一种类型
const a = 1
const b = 2n
const c = BigInt(a) + b // 必须要转为bigint或者number
const d = a + Number(b)
const e = a + b // 报错
console.log(c) // 3n
console.log(d) // 3
3、bigint在转换为number时可能会精度丢失
不建议将bigint转换为number,并且仅在超过number最大安全范围时才使用bigint
4、number可以是小数,bigint只能是整数
console.log(1.2n) // 报错
5、bigint不支持单目运算符+
+号可以当做Number()使用:
console.log(+'1') // 1
console.log(+[]) // 0
console.log(+true) // 1
console.log(+3) // 3
console.log(+null) // 0
console.log(+undefined) // NaN
但是+号不能将bigint转换为number,必须要使用Number():
console.log(+BigInt(1)) // 报错
6、bigint和number宽松相等,严格不等
const a = 1n
const b = 1
console.log(a == b) // true
console.log(a === b) // false
四、bigint和number相同点
1、bigint可以进行+、-、*、/、%、**运算
但是要注意bigint的除法运算中,小数点后面的值会被抹去,向下取整
const a = 1n
const b = 2n
console.log(a + b) // 3n
console.log(a - b) // -1n
console.log(a * b) // 2n
console.log(a / b) // 0n, not 0.5n
console.log(a % b) // 1n
console.log(b ** b) // 4n
2、bigint可以相互之间比较,和number比较规则一致,也可以用来和number比较
console.log(1n < 2n) // true
console.log(1n < 2) // true
console.log(1n <= 1) // true
3、bigint和number可以混在一个数组中并排序
const mixed = [4n, 6, -12n, 10, -12, 6n, -13, -13n, 4, 0, 0n]
console.log(mixed.sort()) // [-12n, -12, -13, -13n, 0, 0n, 10, 4n, 4, 6, 6n]
4、bigint转换为boolean时和number表现一样
console.log(Boolean(1n)) // true
console.log(Boolean(0n)) // false
console.log(!!1n) // true
console.log(!!0n) // false
console.log(!1n) // false
console.log(!0n) // true
console.log(0n && 1n) // 0n
console.log(0n || 1n) // 1n
if (1n) {
console.log('真') // 打印 真
} else {
console.log('假')
}
5、bigint转换为string时和number表现一样
console.log(1 + '') // 1
console.log(1n + '') // 1
console.log(String(1n)) // 1
五、bigint使用场景
number类型在超过最大安全数时精度丢失,此时bigint的作用就体现出来了
const a = Number.MAX_SAFE_INTEGER
console.log(a + 1 === a + 2) // true
const b = BigInt(a)
console.log(b + 1n === b + 2n) // false
六、在bigint之前,前端同学怎么处理精度丢失
我所在的项目暂时还没用过,但是做银行项目的同学应该会用到的吧 解决js浮点数精度丢失