CD's blog CD's blog
首页
  • HTMLCSS
  • JavaScript
  • Vue
  • TypeScript
  • React
  • Node
  • Webpack
  • Git
  • Nestjs
  • 小程序
  • 浏览器网络
  • 学习笔记

    • 《TypeScript 从零实现 axios》
    • Webpack笔记
  • JS/TS教程

    • 《现代JavaScript》教程
🔧工具方法
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

CD_wOw

内卷的行情,到不了的梦
首页
  • HTMLCSS
  • JavaScript
  • Vue
  • TypeScript
  • React
  • Node
  • Webpack
  • Git
  • Nestjs
  • 小程序
  • 浏览器网络
  • 学习笔记

    • 《TypeScript 从零实现 axios》
    • Webpack笔记
  • JS/TS教程

    • 《现代JavaScript》教程
🔧工具方法
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 简介

  • JavaScript 基础知识

  • 数据类型

  • 函数进阶内容

  • 对象属性配置

  • 原型,继承

  • 类

  • 错误处理

  • Promise,asyncawait

  • Generator,高级 iteration

  • 模块

  • 杂项

    • Proxy 和 Reflect
    • 柯里化(Currying)
    • BigInt
      • 数学运算符
      • 比较运算符
      • 布尔运算
      • Polyfill
      • 参考
    • Eval:执行代码字符串
    • Reference Type
  • 《现代JavaScript》教程
  • 杂项
CD_wOw
2020-12-13
目录

BigInt

A recent addition

This is a recent addition to the language. You can find the current state of support at https://caniuse.com/#feat=bigint.

最近添加的

这是最近添加的,你可以在https://caniuse.com/#feat=bigint.上找到当前的支持状态

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

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

const bigint = 1234567890123456789012345678901234567890n;

const sameBigint = BigInt("1234567890123456789012345678901234567890");

const bigintFromNumber = BigInt(10); // 与 10n 相同
1
2
3
4
5

# 数学运算符

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

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

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

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

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

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

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

let bigint = 1n;
let number = 2;

// 将 number 转换为 bigint
alert(bigint + BigInt(number)); // 3

// 将 bigint 转换为 number
alert(Number(bigint) + number); // 3
1
2
3
4
5
6
7
8

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

BigInt 不支持一元加法

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

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

let bigint = 1n;

alert( +bigint ); // error
1
2
3

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

# 比较运算符

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

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

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

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

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

alert( 1 === 1n ); // false
1
2
3

# 布尔运算

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

例如,在 if 中,bigint 0n 为假,其他值为 true:

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

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

alert( 1n || 2 ); // 1(1n 被认为是真)

alert( 0n || 2 ); // 2(0n 被认为是假)
1
2
3

# Polyfill

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

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

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

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

不过,JSBI (opens new window) 库的开发者提出了另一种解决方案。

该库使用自己的方法实现了大的数字。我们可以使用它们替代原生的 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。

# 参考

  • MDN 文档对 BigInt 的介绍 (opens new window)。
  • ECMA262 规范 (opens new window)。
编辑 (opens new window)
#现代JavaScript
上次更新: 2021/08/22, 01:09:59
柯里化(Currying)
Eval:执行代码字符串

← 柯里化(Currying) Eval:执行代码字符串→

最近更新
01
gsap动画库学习笔记 - 持续~
06-05
02
远程组件加载方案笔记
05-03
03
小程序使用笔记
03-29
更多文章>
Theme by Vdoing | Copyright © 2020-2023 CD | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式