JavaScript BigInt
变量用于存储大整数值 太大而无法用普通 JavaScript Number
表示。
JavaScript 整数最多只能精确到 15 位:
let x = 999999999999999;
let y = 9999999999999999;
自己尝试一下→
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Numbers</h1>
<h2>Integer Precision</h2>
<p>Integers (numbers without a period or exponent notation) are accurate up to 15 digits:</p>
<p id="demo"></p>
<script>
let x = 999999999999999;
let y = 9999999999999999;
document.getElementById("demo").innerHTML = x + "<br>" + y;
</script>
</body>
</html>
在 JavaScript 中,所有数字都以 64 位浮点格式存储(IEEE 754 标准)。
在这个标准下,大整数无法精确表示,将会被四舍五入。
因此,JavaScript 只能安全地表示整数:
最多 9007199254740991 +(253-1)
和
降至 -9007199254740991 -(253-1)。
超出此范围的整数值会失去精度。
要创建 BigInt
,请将 n 附加到整数或调用的末尾 BigInt()
:
let x = 9999999999999999;
let y = 9999999999999999n;
自己尝试一下 →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Numbers</h1>
<h2>Integer and BigInt</h2>
<p id="demo"></p>
<script>
let x = 9999999999999999;
let y = BigInt("9999999999999999");
document.getElementById("demo").innerHTML = x + "<br>" + y;
</script>
</body>
</html>
let x = 1234567890123456789012345n;
let y = BigInt(1234567890123456789012345)
自己尝试一下→
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Numbers</h1>
<h2>Create a BigInt</h2>
<p id="demo"></p>
<script>
let x = 123456789012345678901234567890n;
let y = BigInt("123456789012345678901234567890");
document.getElementById("demo").innerHTML = x + "<br>" + y;
</script>
</body>
</html>
JavaScript typeof
BigInt
是“bigint”:
let x = BigInt(999999999999999);
let type = typeof x;
自己尝试一下→
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Numbers</h1>
<h2>BigInt typeof</h2>
<p>The typeof a BigInt is:</p>
<p id="demo"></p>
<script>
let x = BigInt("9999999999999999");
document.getElementById("demo").innerHTML = typeof x;
</script>
</body>
</html>
BigInt
是 JavaScript 中的第二种数字数据类型 (在数字
之后)。
对于 BigInt
,JavaScript 中支持的数据类型总数为 8:
1. 字符串
2. 数量
3.Bigint
4. 布尔
5. 未定义
6. 空
7. 符号
8. 对象
可用于 JavaScript Number
的运算符 也可以在 BigInt
上使用。
let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;
自己尝试一下→
<!DOCTYPE html>
<html>
<body>
<h1>JavScript Bigint</h1>
<h2>BigInt Multiply</h2>
<p>Operators that can be used a Number can be used on a BigInt.</p>
<p id="demo"></p>
<script>
let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;
document.getElementById("demo").innerHTML = z;
</script>
</body>
</html>
BigInt
之间的算术 并且不允许使用 Number
(类型转换会丢失信息)。
无法在 BigInt
上完成无符号右移 (>>>) (它没有固定的宽度)。
BigInt
不能有小数。
let x = 5n;
let y = x / 2;
// Error: Cannot mix BigInt and other types, use explicit conversion.
let x = 5n;
let y = Number(x) / 2;
自己尝试一下→
<!DOCTYPE html>
<html>
<body>
<h1>JavScript Bigint</h1>
<h2>BigInt Divide</h2>
<p>A BigInt can not have decimals.</p>
<p>Cannot mix BigInt and other types, use explicit conversions.</p>
<p id="demo"></p>
<script>
let x = 5n;
let y = Number(x) / 2;
document.getElementById("demo").innerHTML = y;
</script>
</body>
</html>
BigInt
也可以用十六进制、八进制或二进制表示法编写:
let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;
自己尝试一下 →
<!DOCTYPE html>
<html>
<body>
<h1>JavScript Bigint</h1>
<h2>Hex, Octal and Binary</h2>
<p id="demo"></p>
<script>
let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;
document.getElementById("demo").innerHTML = hex + "<br>" + oct + "<br>" + bin;
</script>
</body>
</html>
舍入可能会损害程序安全性:
9007199254740992 === 9007199254740993; // is true !!!
自己尝试一下→
<!DOCTYPE html>
<html>
<body>
<h1>JavScript Numbers</h1>
<h2>Integer Precision</h2>
<p>Is 9007199254740992 equal to 9007199254740993?</p>
<p id="demo"></p>
<script>
let x = 9007199254740992 === 9007199254740993;
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
自 2020 年 9 月起,所有浏览器均支持 BigInt
:
Chrome 67 | Edge 79 | Firefox 68 | Safari 14 | Opera 54 |
May 2018 | Jan 2020 | Jul 2019 | Sep 2020 | Jun 2018 |
ES6 向 Number 对象添加了 max 和 min 属性:
MAX_SAFE_INTEGER
MIN_SAFE_INTEGER
let x = Number.MAX_SAFE_INTEGER;
自己尝试一下→
<!DOCTYPE html>
<html>
<body>
<h2>Number Object Properties</h2>
<p>MAX_SAFE_INTEGER</p>
<p id="demo"></p>
<script>
let x = Number.MAX_SAFE_INTEGER;
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
let x = Number.MIN_SAFE_INTEGER;
自己尝试一下→
<!DOCTYPE html>
<html>
<body>
<h2>Number Object Properties</h2>
<p>MIN_SAFE_INTEGER</p>
<p id="demo"></p>
<script>
let x = Number.MIN_SAFE_INTEGER;
document.getElementById("demo").innerHTML = x;
</script>
</body>
</html>
ES6 还为 Number 对象添加了 2 个新方法:
Number.isInteger()
Number.isSafeInteger()
如果参数是整数,则 Number.isInteger()
方法返回 true
。
Number.isInteger(10);
Number.isInteger(10.5);
自己尝试一下 →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Numbers</h1>
<h2>The isInteger() Method</h2>
<p>The isInteger() method returns true if the argument is an integer.</p>
<p>Otherwise it returns false.</p>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML =
Number.isInteger(10) + "<br>" + Number.isInteger(10.5);
</script>
</body>
</html>
安全整数是可以精确表示为双精度数的整数。
如果参数是安全整数,则 Number.isSafeInteger()
方法返回 true
。
Number.isSafeInteger(10);
Number.isSafeInteger(12345678901234567890);
自己尝试一下→
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Numbers</h1>
<h2>The isSafeInteger() Method</h2>
<p>The isSafeInteger() method returns true if the argument is a safe integer.</p>
<p>Otherwise it returns false.</p>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML =
Number.isSafeInteger(10) + "<br>" + Number.isSafeInteger(12345678901234567890);
</script>
</body>
</html>
安全整数是从 -(253 - 1) 到 +(253 - 1) 的所有整数。
这是安全的:9007199254740991。这是不安全的:9007199254740992。