什么是BigInt?为什么需要BigInt?如何创建并使用BigInt?

BigInt是JavaScript中用于处理大整数的新数据类型,解决了Number类型在超出一定范围后精度丢失的问题。通过在数字后添加n来创建BigInt,但需要注意BigInt不支持与Number的隐式转换,并且在某些运算和API中有限制。目前的浏览器兼容性仍有待提高。

什么是BigInt?

BigInt是一种新的数据类型,用于当整数值大于Number数据类型支持的范围时。这种数据类型允许我们 安全地对 大整数 执行算术操作,表示高分辨率的时间戳,使用大整数id,等等,而不需要使用库。

为什么需要BigInt?

JS中,所有的数字都以双精度64位浮点格式表示,那这会带来什么问题呢?
这导致JS中的Number无法精确表示非常大的整数,它会将非常大的整数四舍五入,确切地说,JS中的 Number类型只能安全地表示-9007199254740991(-(2^53-1))9007199254740991(2^53-1)),任何超出此范围的整数值都可能失去精度。
console.log(999999999999999); //=>10000000000000000
9007199254740992 === 9007199254740993; // → true 居然是true!

 同时也会有一定的安全性问题:

如何创建并使用BigInt

要创建BigInt,只需要在数字末尾追加n即可。
console.log( 9007199254740995n ); // → 9007199254740995n
console.log( 9007199254740995 ); // → 9007199254740996
另一种创建BigInt的方法是用BigInt()构造函数、
BigInt("9007199254740995"); // → 9007199254740995n

 简单使用如下:

10n + 20n; // → 30n
10n - 20n; // → -10n
+10n; // → TypeError: Cannot convert a BigInt value to a number
-10n; // → -10n
10n * 20n; // → 200n
20n / 10n; // → 2n
23n % 10n; // → 3n
10n ** 3n; // → 1000n
const x = 10n;
++x; // → 11n
--x; // → 9n
console.log(typeof x); //"bigint"
值得警惕的点

 

1BigInt不支持一元加号运算符, 这可能是某些程序可能依赖于 + 始终生成 Number 的不变量,或者抛 出异常。另外,更改 + 的行为也会破坏 asm.js代码。
2)因为隐式类型转换可能丢失信息,所以不允许在bigint Number 之间进行混合操作。当混合使用大 整数和浮点数时,结果值可能无法由BigIntNumber精确表示。
10 + 10n; // → TypeError

 

3)不能将BigInt传递给Web api和内置的 JS 函数,这些函数需要一个 Number 类型的数字。尝试这样 做会报TypeError错误。
Math.max(2n, 4n, 6n); // → TypeError
4)当 Boolean 类型与 BigInt 类型相遇时,BigInt的处理方式与Number类似,换句话说,只要不是
0nBigInt就被视为truthy的值。
if(0n){//条件判断为false
}
if(3n){//条件为true
}
5)元素都为BigInt的数组可以进行sort
6BigInt可以正常地进行位运算,如|&<<>>^

浏览器兼容性  

 caniuse的结果:

 

其实现在的兼容性并不怎么好,只有chrome67firefoxOpera这些主流实现,要正式成为规范,其 实还有很长的路要走。
### 数据库中 `BIGINT` 类型的意义和用途 `BIGINT` 是一种用于存储大整数的数据类型,通常用于需要处理超出 `INT` 范围的数值场景。在 MySQL 中,`BIGINT` 可以存储从 `-9223372036854775808` 到 `9223372036854775807` 的有符号整数,或从 `0` 到 `18446744073709551615` 的无符号整数,占用 8 个字节的存储空间[^2]。相比之下,`INT` 类型的范围较小,最大值为 `2147483647`,适用于标准整数场景。 `BIGINT` 的主要用途包括: - **存储大数值**:适用于需要处理非常大的整数的场景,例如高精度计算、大型计数器、时间戳(如 Unix 时间戳的毫秒表示)等。 - **主键或唯一标识符**:在分布式系统中,使用 `BIGINT` 作为主键可以避免 ID 冲突,支持更大的数据增长空间。 - **避免整数溢出**:当数值超过 `INT` 的最大范围时,使用 `BIGINT` 可以防止数据溢出错误。 例如,在 MySQL 中创建一个使用 `BIGINT` 类型的表: ```sql CREATE TABLE big_example_table ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, large_number BIGINT ); ``` 在实际应用中,`BIGINT` 类型常与后端编程语言中的 `Long` 类型对应使用。然而,在 JSON 序列化过程中,如果未正确配置,可能会导致精度丢失。为避免这一问题,可以配置序列化器将 `Long` 类型转换为字符串形式进行传输,从而确保数据的准确性[^3]。 ### `BIGINT` 与其他整数类型的对比 | 数据类型 | 有符号范围最小值 | 有符号范围最大值 | 无符号范围最大值 | 存储空间(字节) | |-------------|------------------------|------------------------|------------------------|------------------| | `TINYINT` | -128 | 127 | 255 | 1 | | `SMALLINT` | -32768 | 32767 | 65535 | 2 | | `MEDIUMINT` | -8388608 | 8388607 | 16777215 | 3 | | `INT` | -2147483648 | 2147483647 | 4294967295 | 4 | | `BIGINT` | -9223372036854775808 | 9223372036854775807 | 18446744073709551615 | 8 | ### 示例:`BIGINT` 的使用场景 假设有一个需要存储用户累计积分的字段,考虑到用户可能积累非常大的积分值,可以使用 `BIGINT` 类型: ```sql CREATE TABLE user_points ( user_id INT PRIMARY KEY, total_points BIGINT ); ``` 插入数据示例: ```sql INSERT INTO user_points (user_id, total_points) VALUES (1, 9223372036854775807); ``` 查询数据示例: ```sql SELECT * FROM user_points; ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值