ES2020 系列:新增基本数据类型 BigInt

简介: ES2020 系列:新增基本数据类型 BigInt

640.png

BigInt


BigInt 是一种特殊的数字类型,它提供了对任意长度整数的支持。

创建 bigint 的方式有两种:在一个整数字面量后面加 n 或者调用 BigInt 函数,该函数从字符串、数字等中生成 bigint。


const bigint = 1234567890123456789012345678901234567890n;
const sameBigint = BigInt("1234567890123456789012345678901234567890");
const bigintFromNumber = BigInt(10); // 与 10n 相同


数学运算符


BigInt 大多数情况下可以像常规数字类型一样使用,例如:


alert(1n + 2n); // 3
alert(5n / 2n); // 2


请注意:除法 5/2 的结果向零进行舍入,舍入后得到的结果没有了小数部分。对 bigint 的所有操作,返回的结果也是 bigint。


我们不可以把 bigint 和常规数字类型混合使用:


alert(1n + 2); // Error: Cannot mix BigInt and other types


如果有需要,我们应该显式地转换它们:使用 BigInt() 或者 Number(),像这样:


let bigint = 1n;
let number = 2;
// 将 number 转换为 bigint
alert(bigint + BigInt(number)); // 3
// 将 bigint 转换为 number
alert(Number(bigint) + number); // 3


转换操作始终是静默的,绝不会报错,但是如果 bigint 太大而数字类型无法容纳,则会截断多余的位,因此我们应该谨慎进行此类转换。


BigInt 不支持一元加法


一元加法运算符 +value,是大家熟知的将 value 转换成数字类型的方法。


为了避免混淆,在 bigint 中不支持一元加法:


let bigint = 1n;
alert( +bigint ); // error


所以我们应该用 Number() 来将一个 bigint 转换成一个数字类型。


比较运算符


比较运算符,例如 <>,使用它们来对 bigint 和 number 类型的数字进行比较没有问题:


alert( 2n > 1n ); // true
alert( 2n > 1 ); // true


但是请注意,由于 number 和 bigint 属于不同类型,它们可能在进行 == 比较时相等,但在进行 ===(严格相等)比较时不相等:


alert( 1 == 1n ); // true
alert( 1 === 1n ); // false


布尔运算


当在 if 或其他布尔运算中时,bigint 的行为类似于 number。

例如,在 if 中,bigint 0nfalse,其他值为 true


if (0n) {
  // 永远不会执行
}


布尔运算符,例如 ||&& 和其他运算符,处理 bigint 的方式也类似于 number:


alert( 1n || 2 ); // 1(1n 被认为是 true)
alert( 0n || 2 ); // 2(0n 被认为是 false)


Polyfill


Polyfilling bigint 比较棘手。原因是许多 JavaScript 运算符,比如 +- 等,在对待 bigint 的行为上与常规 number 相比有所不同。


例如,bigint 的除法总是返回 bigint(如果需要,会进行舍入)。

想要模拟这种行为,polyfill 需要分析代码,并用其函数替换所有此类运算符。但是这样做很麻烦,并且会耗费很多性能。


所以,目前并没有一个众所周知的好用的 polyfill。

不过,JSBI[1] 库的开发者提出了另一种解决方案。


该库使用自己的方法实现了大的数字。我们可以使用它们替代原生的 bigint:


运算 原生 BigInt JSBI
从 Number 创建 a = BigInt(789) a = JSBI.BigInt(789)
加法 c = a + b c = JSBI.add(a, b)
减法 c = a - b c = JSBI.subtract(a, b)
... ... ...


……然后,对于那些支持 bigint 的浏览器,可以使用 polyfill(Babel 插件)将 JSBI 调用转换为原生的 bigint。


换句话说,这个方法建议我们在写代码时使用 JSBI 替代原生的 bigint。但是 JSBI 在内部像使用 bigint 一样使用 number,并最大程度按照规范进行模拟,所以代码已经是准备好转换成 bigint 的了(bigint-ready)。


对于不支持 bigint 的引擎,我们可以“按原样”使用此类 JSBI 代码,对于那些支持 bigint 的引擎 — polyfill 会将调用转换为原生的 bigint。

目录
相关文章
|
SQL 前端开发 API
关于ElementUI之动态树+数据表格+分页实例
关于ElementUI之动态树+数据表格+分页实例
885 0
|
Java Android开发
|
10月前
|
供应链 安全 前端开发
供应链到底管什么?
本文深入解析供应链管理的本质与核心逻辑,突破传统认知误区,围绕计划、采购、执行、交付四大环节,系统阐述如何构建高效协同的供应链体系,助力企业实现资源优化配置与稳健运营。
|
7月前
|
人工智能 自然语言处理 安全
AI助教系统:基于大模型与智能体架构的新一代教育技术引擎
AI助教系统融合大语言模型、教育知识图谱、多模态交互与智能体架构,实现精准学情诊断、个性化辅导与主动教学。支持图文语音输入,本地化部署保障隐私,重构“教、学、评、辅”全链路,推动因材施教落地,助力教育数字化转型。(238字)
1325 23
|
7月前
|
存储 人工智能 搜索推荐
拔俗AI大模型教学平台:开启智能教育新时代
在AI与教育深度融合背景下,本文基于阿里云技术构建大模型教学平台,破解个性化不足、反馈滞后等难题。通过“大模型+知识图谱+场景应用”三层架构,实现智能答疑、精准学情分析与个性化学习路径推荐,助力教学质量与效率双提升,推动教育智能化升级。
939 0
|
10月前
|
存储 缓存 安全
电脑更换更大硬盘,系统迁移怎么做?
电脑使用多年后,常因硬盘空间不足导致系统卡顿、游戏无法安装。升级更大容量固态硬盘并迁移系统,无需重装系统和软件,普通用户也能轻松在家完成。本文详解操作步骤,手把手教你提升电脑性能与存储空间。
|
搜索推荐
Flutter 中的 AnimationController 类
【10月更文挑战第18天】深入了解了 Flutter 中的 `AnimationController`类。它是构建精彩动画效果的重要基石,掌握它的使用方法对于开发具有吸引力的 Flutter 应用至关重要。
476 59
|
存储 数据库 C语言
c语言实现b树
这篇文章介绍了B树的概念、特点和应用场景,并提供了一个C语言实现的B树数据结构示例代码,包括节点定义、创建新节点、分裂节点、插入关键字和打印B树等函数。
384 1
c语言实现b树
|
人工智能 自然语言处理 数据可视化
什么是AIGC?如何使用AIGC技术辅助办公?
2分钟了解AIGC技术及其如何提高日常办公效率!
4544 4
什么是AIGC?如何使用AIGC技术辅助办公?
|
关系型数据库 数据库 PostgreSQL
POSTGRESQL中时间戳的奥秘timestamptz
探索 PostgreSQL 中的时间戳类型:timestamp 代表无时区的时间点,而 timestamptz 包含时区信息,可转换。了解它们的区别对于数据库操作至关重要。使用 `AT TIME ZONE` 关键字可实现两者间的转换。关注木头左,获取更多数据库知识!
POSTGRESQL中时间戳的奥秘timestamptz

热门文章

最新文章