TypeScript BigInt

本节介绍的 bigint 数据类型是用来表示那些已经超出了 number 类型最大值的整数值,对于总是被诟病的整数溢出问题,使用了 bigint 后将完美解决。

1. 慕课解释

bigint 是一种基本数据类型(primitive data type)。

JavaScript 中可以用 Number 表示的最大整数为 2^53 - 1,可以写为 Number.MAX_SAFE_INTEGER。如果超过了这个界限,可以用 BigInt来表示,它可以表示任意大的整数。

2. 语法

在一个整数字面量后加 n 的方式定义一个 BigInt,如:10n 或者调用函数 BigInt()

const theBiggestInt = 9007199254740991n
const alsoHuge = BigInt(9007199254740991)
const hugeString = BigInt("9007199254740991")theBiggestInt === alsoHuge // true
theBiggestInt === hugeString // true

代码解释:

第 1-3 行,分别是三种表达整数 9007199254740991 的方式,方式不同含义相同,所以完全相等。

BigInt 与 Number 的不同点:

  • BigInt 不能用于 Math 对象中的方法。
  • BigInt 不能和任何 Number 实例混合运算,两者必须转换成同一种类型。
  • BigInt 变量在转换为 Number 变量时可能会丢失精度。
const biggest = Number.MAX_SAFE_INTEGERconst biggest1 = biggest + 1
const biggest2 = biggest + 2biggest1 === biggest2 // true 超过精度

代码解释:

第 1 行,声明了一个 number 类型最大值的变量 biggest,对于 number 类型来说,这个就是最大精度。

第 3-4 行,最大精度就是这个容器已经完全满了,无论往上加多少都会溢出,所以这两个值是相等的。

而使用 BigInt:

const biggest = BigInt(Number.MAX_SAFE_INTEGER)const biggest1 = biggest + 1n
const biggest2 = biggest + 2nbiggest1 === biggest2 // false

代码解释:

第 1 行,声明了一个 bigint 类型的变量 biggest

第 3-4 行,bigint 类型就是用来表示那些已经超出了 number 类型最大值的整数值,也就是这个容器还没满,在此基础上加上两个不同的值,其结果不相等。

3. 类型信息

使用 typeof 检测类型时,BigInt 对象返回 bigint:

typeof 10n === 'bigint'         // true
typeof BigInt(10) === 'bigint'  // truetypeof 10 === 'number'          // true
typeof Number(10) === 'number'  // true

代码解释:

typeof 操作符返回一个字符串,表示未经计算的操作数的类型,用来判断基础数据类型。

第 1-2 行,两个书写方式都是 bigint 类型,所以相等。

第 4-5 行,两种书写方式都是 number 类型,所以相等。

4. 运算

BigInt 可以正常使用 +-*/**% 符号进行运算:

const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER)  // 9007199254740991nconst maxPlusOne = previousMaxSafe + 1n                  // 9007199254740992nconst multi = previousMaxSafe * 2n                       // 18014398509481982nconst subtr = multi – 10n                                // 18014398509481972nconst mod = multi % 10n                                  // 2nconst bigN = 2n ** 54n                                   // 18014398509481984n

Tip: 当使用 / 操作符时,会向下取整,不会返回小数部分:

const divided = 5n / 2n                                   // 2n, not 2.5n

5. 比较 与 条件

Number 和 BigInt 可以进行比较:

0n === 0 // false0n == 0 // true1n < 2  // true2n > 1  // true2 > 2   // false2n > 2  // false2n >= 2 // true

条件判断:

if (0n) {console.log('条件成立!');
} else {console.log('条件不成立!'); // 输出结果
}0n || 10n    // 10n0n && 10n    // 0nBoolean(0n)  // falseBoolean(10n) // true!10n         // false!0n          // true

代码解释:

后面会有一节介绍 Truthy 与 Falsy,这里先简单提下。除了明确的 true 和 false 两个 boolean 类型外,JavaScript 可以在需要用到布尔类型值的上下文中使用强制类型转换将值转换为布尔值。

比如 0 是假,10 是真。那么,同样的,0n 是假,10n 是真。

6. 小结

本小节介绍了 BigInt 类型相关知识,由于在 Number 与 BigInt 之间进行转换会损失精度,建议:

  • 不要在两种类型之间进行相互转换。
  • 仅在值可能大于 2^53 - 1 时使用 BigInt

TypeScript BigInt相关推荐

  1. TypeScript 终极初学者指南

    大家好,我是若川.持续组织了8个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步.同时极力推荐订阅我写的<学习源码整体架构系列& ...

  2. TypeScript 原来可以这么香?!

    先问一个问题,JavaScript有几种数据类型? number.string.boolean.null.undefined.symbol.bigint.object 其中 bigint 是 ES20 ...

  3. TypeScript Symbol

    TypeScript Symbol 本节介绍 symbol 类型的语法.使用方法和应用场景,每个从 Symbol() 返回值的唯一性是使用 symbol 类型的最重要原因. 1. 慕课解释 symbo ...

  4. TypeScript 基础类型 1

    TypeScript 基础类型 自本节起,我们将开始接触 TypeScript 的类型系统,这也是 TypeScript 最为核心的部分. 本节介绍 TypeScript 中一些基础类型,有些特殊类型 ...

  5. 【lib.es5】ArrayBuffer、DataView 的TypeScript接口

    ArrayBuffer.DataView 的 TypeScript 接口 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.net/qq_28550263 ...

  6. TypeScript简记

    文章目录 概述 与 JavaScript 的不同 JavaScript 简记 差异 如何选择 静态类型 推理类型 定义类型 原始类型 组合类型 判断类型 结构类型系统 参考 从 JavaScript ...

  7. 超详细的TypeScript入门教程!

    在看这篇文章之前,我是强烈推荐TypeScript 入门教程这本书的.因为这本书它是:从 JavaScript 程序员的角度总结思考,循序渐进的理解TypeScript.文章来源也是该书,但听我一句话 ...

  8. typescript学习笔记1-tsconfig.json配置和变量类型声明

    一,tsconfig.json {// 编译器选项"compilerOptions": {/* 基本选项 */"target": "es5" ...

  9. 2022 最新TypeScript入门学习笔记

    TypeScript的概念 TypeScript是什么? TypeScript是JavaScript类型的超集,它可以编译成纯JavaScript. TypeScript可以在任何浏览器.任何计算机和 ...

最新文章

  1. Mysql分页order by数据错乱重复
  2. 第二讲,我们来谈谈:“什么是二进制”
  3. 【Java多线程】Join的使用、如何使用getState()查看线程的状态
  4. Source Insight常用快捷键
  5. python 属性描述符
  6. VScode安装(ubuntu)
  7. html怎么实现单个li效果,JS+CSS实现的一个li:hover效果
  8. tomcat部署php项目 css样式丢失_webpack 打包编译有些CSS样式莫名消失?
  9. 推荐算法之用户推荐(UserCF)和物品推荐(ItemCF)对比
  10. element-ui自定义手机号的验证
  11. viso添加多个图注_Visio画图几个技巧
  12. Total和Tellurian签署意向性协议,对Driftwood项目和2.5 mtpa LNG进行股权投资;就增加对Tellurian投资签署普通股购买协议
  13. VirtualBox安装Mac OS 10.11——虚拟机安装黑苹果
  14. nar-gab投稿记录
  15. 定量库存控制模型_定量订货库存管理模型分析及应用
  16. 工作笔记八——vue项目的多语言/国际化插件vue-i18n详解
  17. VR全景看家装,让家装不再“纸上谈兵”
  18. Hadoop HA集群配置问题记录
  19. Oracle Core: Essential Internals for DBAs and Developers
  20. golang for嵌套循环中break 的注意事项和使用细节: break 语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块

热门文章

  1. Enterprise Library v5.0 -- Data Access Application Block 开发向导(3)
  2. Windows下IIS+PHP 5.2的安装与配置
  3. BugTracker.NET安装指南
  4. 反应器(Reactor):用于事件多路分离和分派的体系结构模式
  5. 【今日CS 视觉论文速览】8 Jan 2019
  6. linux 分卷解压
  7. 0407 背景相关的作业
  8. 线程名称的获取与修改
  9. 浮动元素与兄弟之间的关系 速记 1211
  10. 背景位置 background-position 0916