今天想起了js新增的基本数据类型,就去上网查阅了一番,在此做个总结。

首先我们要了解它是干什么的,BigInt数据类型的目的是比Number数据类型支持的范围更大的整数值以任意精度表示整数的能力尤为重要。使用BigInt,整数溢出将不再是问题。

因为在js中的数字类型是按照IEEE 754-2008标准的定义,所有数字都以双精度64位浮点格式表示。因为在IEEE 754标准下浮点数的舍入模式是一下4类:

最近舍入 即向距离最近的浮点数舍入,若存在两个同样接近的数,则选择偶数作为舍入值
向零舍入 又称截断舍入,将多余的精度位截掉,即取舍入后绝对值较小的值
正向舍入 也称正无穷舍入,即舍入后结果大于原值
负向舍入 也称负无穷舍入,即舍入后结果小于原值

所以在此标准下,无法精确表示的非常大的整数将自动四舍五入。确切地说,JS 中的Number类型只能安全地表示-9007199254740991 (-(2^53-1))9007199254740991(2^53-1)之间的整数,任何超出此范围的整数值都可能失去精度。

console.log(9999999999999999); //10000000000000000

因为该整数大于JS Number类型所能表示的最大整数,所以它被四舍五入了,意外的四舍五入会损害程序的可靠性和安全性。例如:

// 注意最后一位的数字
9007199254740992 === 9007199254740993; //true

原因是因为,JS提供Number.MAX_SAFE_INTEGER常量表示最大安全整数,Number.MIN_SAFE_INTEGER常量表示最小安全整数。
可以把它打印出来:

const minInt = Number.MIN_SAFE_INTEGER;console.log(minInt); //-9007199254740991console.log(minInt - 5); //-9007199254740996// 注意它是如何输出与上面相同的值的
console.log(minInt - 4); // -9007199254740996

解决方案
使用 bignumber.js 处理大整数

使用 BigInt 应用程序不再需要变通方法或库来安全地表示Number.MAX_SAFE_INTEGERNumber.Min_SAFE_INTEGER之外的整数。 现在可以在标准JS中执行对大整数的算术运算,而不会有精度损失的风险。

要创建BigInt,只需在整数的末尾追加n即可。比如:

console.log(9007199254740995n); //9007199254740995n
console.log(9007199254740995); //9007199254740996

或者可以调用 BigInt() 构造函数

BigInt("9007199254740995"); //9007199254740995n

BigInt构造函数
与其他基本类型一样,可以使用构造函数创建BigInt。传递给BigInt()的参数将自动转换为BigInt

BigInt("10");    //10n
BigInt(10);      //10n
BigInt(true);    //1n

无法转换的数据类型和值会引发异常

BigInt(10.2);     //RangeError
BigInt(null);     //TypeError
BigInt("abc");    //SyntaxError

可以直接对使用构造函数创建的BigInt执行算术操作

BigInt(10) * 10n;    //100n

在使用严格相等运算符时,使用构造函数创建的BigInt 与常规BigInt 的处理方式类似

BigInt(true) === 1n;    //true
console.log( 1n == true) //true

BigInt 也可以用二进制,八进制或十六进制表示

// binary 二进制
console.log(0b100000000000000000000000000000000000000000000000000011n);
//9007199254740995n// hex 十六进制
console.log(0x20000000000003n);
//9007199254740995n// octal 八进制
console.log(0o400000000000000003n);
//9007199254740995n// 注意,不支持遗留的八进制语法
console.log(0400000000000000003n);
//SyntaxError 语法错误

不能使用严格相等运算符将BigInt与常规数字进行比较,因为它们的类型不同, 如下:

console.log(1n === 1); //falseconsole.log(typeof 10n); //bigintconsole.log(typeof 10); //number

但在使用等号运算符,它在处理操作之前执行隐式转换

console.log(1n == 1); //true

除了一元加号(+)运算符外,所有的算术运算符都可以用于BigInt

1n + 2n;  //3n
1n - 2n;  //-1n
+10n;     //语法错误
//TypeError: Cannot convert a BigInt value
//to a number:不能将BigInt值转换为数字
-1n;      //-1n
1n * 2n;  //2n
2n / 2n;  //1n
10n % 3n;  //1n
10n ** 2n;  //100nvar a = 1n;
++a;          //2n
--a;          //0n

不支持一元加号(+)运算符的原因是某些程序可能依赖于+始终生成Number的不变量,或者抛出异常。 更改+的行为也会破坏asm.js代码。

当然, BigInt 进行算术运算符的操作时返回的是 `BigInt值。因此,除法运算符的结果会自动向下舍入到最接近的整数。 如:

15 / 10; //1.5
15n / 10n //1n

隐式转换
因为隐式转换可能会导致信息丢失,所以不允许在 BigIntNumber 之间进行混合操作。当混合使用大整数和浮点数时,结果可能无法由 BigIntNumber 精确表示。如:

console.log((9007199254740992n + 1n) + 0.5)
//抛出错误:不能混合使用BigInt和其他类型,请使用显式转换

这个表达式的结果超出了BigIntNumber的范围。小数部分的Number不能精确地转换为BigInt。大于2^53BigInt不能准确地转换为数字。

由于这个限制,不可能对混合使用NumberBigInt操作数执行算术操作。还不能将BigInt传递给Web api和内置的 JS 函数,这些函数需要一个 Number 类型的数字。尝试这样做会报TypeError类型错误

console.log(10 + 10n); //TypeError
console.log(Math.max(1n, 2n, 3n)); //TypeError

但是关系运算符不遵循改规则

console.log(2n > 1); //true

如果使用到BigInt和Number执行算术计算的话,首先要确定在哪个类型下进行操作

BigInt(5) + 10n; //15n
//或者
5 + Number(10n) //15

BigIntBoolean类型一起使用时,方法和Number类似

if(2n) {//要执行的逻辑
}

如果判断是0n时则无效

if(0n) {//大括号里的逻辑将不会执行
}

在进行BigInts和Numbers数组的排序时,不会发生隐式类型转换

const arr = [3n, 4, 2, 1n, 0, -1n];arr.sort(); //[-1n, 0, 1n, 2, 3n, 4]

显示转换和隐式转换

隐式转换就是系统默认的、不需要加以声明就可以进行的转换。一般情况下,数据的类型的转换通常是由编译系统自动进行的,不需要人工干预,所以被称为隐式类型转换。但如果程序要求一定要将某一类型的数据转换为另外一种类型,则可以利用强制类型转换运算符进行转换,这种强制转换过程称为显式转换。

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

不能使用NumberBigInt操作数的混合执行算术运算,需要通过显式转换其中的一种类型。 此外,出于兼容性原因,不允许在BigInt上使用一元加号(+)运算符。

JS基本数据类型 —— BigInt相关推荐

  1. JS 最新数据类型:BigInt

    在 JS 中,存在着 7 种原始值,分别是: boolean null undefined number string symbol bigint 什么是BigInt? BigInt是一种新的数据类型 ...

  2. JS新增基本数据类型--BigInt

    文章目录 背景 一.BigInt是什么? 二.使用方法 1.创建 2.类型判断 3.算术运算 4.逻辑运算 条件判断 5.不能使用 Math内置对象 总结 背景 JS基本数据类型Number使用IEE ...

  3. JS 基本数据类型之 BigInt 的知识点

    概念 BigInt 是一种内置对象,它提供了一种方法来表示大于 253 - 1的整数.BigInt 可以表示任意大的整数. 为什么会出现 BigInt 数据类型 JavaScript中的基本数据类Nu ...

  4. js检测数据类型四种办法

    typeof类型检测 作用:用于判断一个一个表达式,(对象或者原始值),返回一个字符串. var a; var b=null; var c=true; var d=1; var e='s'; var ...

  5. 数值的扩展方法以及新增数据类型BigInt

    二进制和八进制表示法 ES6提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o或(0O)表示 0b111110111 === 503 // true; 0o767 === 503; / ...

  6. js基本数据类型及判断方法

    js的基本数据类型? 七种,Number String Boolean Null Undefined Bigint symbol 如何判断js的数据类型 ? 引申提问:各自的优缺点和应用场景 1. 判 ...

  7. js判断数据类型常用的6种方法

    js判断数据类型常用的方法,不论在开发中开始在面试中,都是经常遇到的问题,尤其是在面试时,当面试官问及js判断数据类型的方法时,回答的越多,说明掌握的广度跟深度越多,感觉自己逼格也越高.废话不多说了, ...

  8. js基础--数据类型检测的相关知识

    欢迎访问我的个人博客:www.xiaolongwu.cn 前言 最近工作有点忙,好几天都没更新技术博客了. 周末起床打开有道云笔记,发现自己的博客todolist里躺了一堆只有名字的文件. 话不多说, ...

  9. js的数据类型--数字

    近期做一些项目的时候发现,自己的js基础还是不够扎实,再看一遍犀牛书,加深自己的理解和印象.所以从这篇文章开始,后面都是关于原生js的一些内容. 这篇文章,我们具体介绍一下js的数据类型其中一种. j ...

最新文章

  1. JavaMail邮件发送不成功的那些坑人情况及分析说明
  2. 【转】理解IIS7的用户和组
  3. Transform的normalize参数含义
  4. Google 重返中国的忧虑
  5. 【Luogu1363】幻想迷宫
  6. winrar64位怎么破解
  7. 初识Quartz之CronTrigger
  8. Qt 安装组件及其说明(by shany shang)
  9. 基于go语言的牛牛游戏服务器搭建
  10. 服务器设置来电自动重启,电脑来电自动重启怎么样设置
  11. 随机存储器(RAM),只读存储器(ROM),高速缓存(CACHE),内存,硬盘,CPU
  12. hadoop错误:java.io.IOException: There appears to be a gap in the edit log. We expected txid 1
  13. 让苹果iOS的手机iPhone和电脑Safari浏览器支持油猴脚本
  14. android内存扩展格式,一文看懂:如何为你的安卓手机选择合适的存储卡
  15. 购买PG霜,请认准官方网站
  16. 趋势一次一单EA,不加仓不网格,每单带止损止盈,风险可控
  17. RT 3570 wifi 移植手册
  18. ORACLE数据库NLS_CHARACTERSET和NLS_NCHAR_CHARACTERSET区别
  19. 关于 CST 和UTC时间的理解
  20. linux双系统联网设置,双系统及linux 虚拟机搞定,成功配置好教育网更新和联网状态...

热门文章

  1. 计算机科学ms 和thesis,计算机专业硕士申请有多难?看完你就知道了
  2. Linux中的组管理员-gpasswd
  3. JAVA ParameterizedType的用处
  4. uniapp 阅读页 上下左右翻页 动态字体切换 章节列表 排版 字号 背景 等等
  5. 非递归创建排序二叉树
  6. 本地缓存的三种方式:sessionStorage、localStorage、Cookie
  7. 补充3 需求分配和工厂选址模型(工厂和仓库同时选址)——基于java和cplex的实现
  8. java获取服务器的cpu和内存使用率
  9. 快捷键Java模板注释_eclipse 设置注释模板& 调出注释快捷键
  10. JS函数传参时:值传递与引用传递的区别