ECMAScript 2020 是 JavaScript 的最新版本,其中引入了 BigInt 类型。BigInt 类型是一种用于表示大整数的新数据类型,可以处理超过 Number 类型范围的整数。本文将介绍如何在 JavaScript 中使用 BigInt 类型,以及它的深度和学习以及指导意义。
BigInt 类型的介绍
在 JavaScript 中,Number 类型可以表示的整数范围为 $-2^{53}$ 到 $2^{53}$,超出这个范围的整数将丢失精度。BigInt 类型是一种新的数据类型,可以处理超出 Number 类型范围的整数,它可以表示任意精度的整数。
BigInt 类型的表示方式是在整数后面加 n,例如:
const bigIntNum = 1234567890123456789012345678901234567890n;
BigInt 类型的使用
BigInt 类型的使用方法与 Number 类型类似,可以进行加、减、乘、除等数学运算。需要注意的是,BigInt 类型与 Number 类型不能混合运算,需要进行类型转换。
// www.javascriptcn.com code example const a = 1234567890123456789012345678901234567890n; const b = 9876543210987654321098765432109876543210n; const c = a + b; // 11111111111111111111111111111111111111100n const d = a - b; // -8641975320864197532086419753208641975310n const e = a * b; // 12193263113702179510429358100765224569826758657200777291336985802877616358300n const f = a / b; // 0n const g = a + 123; // Error: Cannot mix BigInt and other types, use explicit conversions const h = Number(a) + 123; // 1234567890123456789012345678901234568013
BigInt 类型的深度和学习意义
BigInt 类型是 ECMAScript 2020 中引入的新功能,它对于处理大整数的场景非常有用。在实际开发中,我们经常需要处理超出 Number 类型范围的整数,例如加密算法、数字签名等领域。使用 BigInt 类型可以避免精度丢失的问题,提高计算结果的准确性和可靠性。
另外,BigInt 类型的引入也反映了 JavaScript 社区对于语言发展的关注和贡献。JavaScript 作为一门动态语言,一直在不断地发展和完善,BigInt 类型的引入也为 JavaScript 的未来发展带来了更多可能性。
示例代码
下面是一个使用 BigInt 类型进行加密算法的示例代码:
// www.javascriptcn.com code example
function sha256(message) {
const H = [
0x6a09e667n, 0xbb67ae85n, 0x3c6ef372n, 0xa54ff53an,
0x510e527fn, 0x9b05688cn, 0x1f83d9abn, 0x5be0cd19n
];
const K = [
0x428a2f98n, 0x71374491n, 0xb5c0fbcfn, 0xe9b5dba5n,
0x3956c25bn, 0x59f111f1n, 0x923f82a4n, 0xab1c5ed5n,
0xd807aa98n, 0x12835b01n, 0x243185ben, 0x550c7dc3n,
0x72be5d74n, 0x80deb1f0n, 0x9bdc06a7n, 0xc19bf174n,
0xe49b69c1n, 0xefbe4786n, 0x0fc19dc6n, 0x240ca1ccn,
0x2de92c6fn, 0x4a7484aan, 0x5cb0a9dcn, 0x76f988dan,
0x983e5152n, 0xa831c66dn, 0xb00327c8n, 0xbf597fc7n,
0xc6e00bf3n, 0xd5a79147n, 0x06ca6351n, 0x14292967n,
0x27b70a85n, 0x2e1b2138n, 0x4d2c6dfcn, 0x53380d13n,
0x650a7354n, 0x766a0abbn, 0x81c2c92en, 0x92722c85n,
0xa2bfe8a1n, 0xa81a664bn, 0xc24b8b70n, 0xc76c51a3n,
0xd192e819n, 0xd6990624n, 0xf40e3585n, 0x106aa070n,
0x19a4c116n, 0x1e376c08n, 0x2748774cn, 0x34b0bcb5n,
0x391c0cb3n, 0x4ed8aa4an, 0x5b9cca4fn, 0x682e6ff3n,
0x748f82een, 0x78a5636fn, 0x84c87814n, 0x8cc70208n,
0x90befffan, 0xa4506ceb, 0xbef9a3f7n, 0xc67178f2n
];
function rotr(x, n) {
return (x >> nn) | (x << (32 - nn));
}
function ch(x, y, z) {
return (x & y) ^ (~x & z);
}
function maj(x, y, z) {
return (x & y) ^ (x & z) ^ (y & z);
}
function sigma0(x) {
return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
}
function sigma1(x) {
return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
}
function gamma0(x) {
return rotr(x, 7) ^ rotr(x, 18) ^ (x >> 3);
}
function gamma1(x) {
return rotr(x, 17) ^ rotr(x, 19) ^ (x >> 10);
}
function sha256Block(H, M, K) {
const W = new Array(64).fill(0n);
for (let i = 0; i < 16; i++) {
W[i] = BigInt("0x" + M.slice(i * 8, (i + 1) * 8));
}
for (let i = 16; i < 64; i++) {
const s0 = sigma0(W[i - 15]);
const s1 = sigma1(W[i - 2]);
W[i] = W[i - 16] + s0 + W[i - 7] + s1;
}
let a = H[0];
let b = H[1];
let c = H[2];
let d = H[3];
let e = H[4];
let f = H[5];
let g = H[6];
let h = H[7];
for (let i = 0; i < 64; i++) {
const S1 = gamma1(e) + ch(e, f, g) + h + K[i] + W[i];
const S0 = gamma0(a) + maj(a, b, c);
h = g;
g = f;
f = e;
e = d + S1;
d = c;
c = b;
b = a;
a = S1 + S0;
}
H[0] += a;
H[1] += b;
H[2] += c;
H[3] += d;
H[4] += e;
H[5] += f;
H[6] += g;
H[7] += h;
return H;
}
message += "\x80";
const len = message.length * 8n;
const lenBytes = [];
for (let i = 0; i < 8; i++) {
lenBytes.push(Number((len >> (56n - 8n * BigInt(i))) & 0xffn));
}
message += String.fromCharCode(...lenBytes);
let H = [...H];
for (let i = 0; i < message.length; i += 64) {
H = sha256Block(H, message.slice(i, i + 64), K);
}
const result = H.map(h => h.toString(16).padStart(8, "0")).join("");
return result;
}
const message = "Hello, world!";
const digest = sha256(message);
console.log(digest);该示例代码使用 BigInt 类型实现了 SHA-256 哈希算法,可以处理任意长度的消息,并输出固定长度的哈希值。该示例代码可以说明 BigInt 类型在加密算法等领域的应用。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67da35caa941bf71341fa12e