javascript bigint支持任意精度整数,轻量级128位运算库应直接复用原生bigint运算符,聚焦安全构造、语义封装(如ipv6解析、位域操作)和json兼容性处理,避免重复实现基础运算。

JavaScript 的 BigInt 原生支持任意精度整数,但需注意:它本身**不限制位宽**,128 位只是常见需求场景(如 UUID、IPv6、时间戳、加密标识)的精度下限。构建轻量级运算库的关键不是“强行截断到128位”,而是**正确利用 BigInt 的无界特性,并在必要时做语义约束与边界检查**。
核心设计原则:不封装 BigInt,而封装语义
直接暴露 BigInt 类型会带来隐式转换陷阱(如不能与 number 混用、JSON 不支持)。轻量库应聚焦三件事:
- 提供安全的构造入口(自动处理字符串/number/Hex/Binary 输入)
- 封装常用 128 位相关操作(如高位截取、位域解析、IPv6 地址段提取)
- 避免重写加减乘除——直接复用
+、-、*、/、%等原生 BigInt 运算符
关键能力实现示例
128 位数值的安全构造
统一接受多种输入,内部转为 BigInt 并校验是否在 128 位范围内(可选):
function int128(value) {
let n;
if (typeof value === 'string') {
if (value.startsWith('0x') || value.startsWith('0X')) {
n = BigInt(value);
} else if (/^[0-9]+$/.test(value)) {
n = BigInt(value);
} else {
throw new Error('Invalid decimal string');
}
} else if (typeof value === 'number') {
if (!Number.isSafeInteger(value)) {
throw new Error('Number too large for safe integer');
}
n = BigInt(value);
} else if (value instanceof Uint8Array) {
// 16-byte big-endian: [0,1,2,...,15] → high→low
n = value.reduce((acc, byte) => (acc // 可选:强制 128 位无符号范围检查
const max128 = 1n = max128) {
throw new RangeError(<code>Value out of 128-bit unsigned range [0, ${max128 - 1n}]</code>);
}
return n;
}
高位 64 位提取(适用于分片聚合、路由哈希)
类似 MySQL 中 “前64位” 需求,用位移比字符串截取更可靠:
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
function upper64(n) {
if (n >= (1n > 64n; // 直接右移64位,得高64位整数
}
<p>// 示例:int128("25495123833603613494099723681886") → upper64() → 1382093432409n
</p>
IPv6 地址转 128 位 BigInt(零压缩兼容)
将标准 IPv6 字符串(含 "::")解析为唯一 BigInt,便于索引或比较:
function ipv6ToBigInt(ipv6Str) {
const parts = ipv6Str.split(':');
const full = [];
let doubleColonIndex = -1;
<p>for (let i = 0; i </p><p>if (doubleColonIndex !== -1) {
const missing = 8 - full.length;
const insert = Array(missing).fill('0000');
full.splice(doubleColonIndex, 0, ...insert);
}</p><p>const hexStr = full.join('');
return BigInt('0x' + hexStr);
}
</p>
轻量 ≠ 功能少,而是不重复造轮子
不要重写加法或乘法——BigInt 已高效实现;也不要模拟浮点行为(那是 BigDecimal 的事)。重点补充以下实用层:
-
toBytes():返回长度为 16 的
Uint8Array(大端),用于网络传输或 WebCrypto -
bitAt(pos):快速读取第
pos位(0~127),支持位掩码操作 - isInSubnet(maskBits):配合 IPv6 地址做前缀匹配(如 /64 判断)
- toString(16).padStart(32, '0'):标准化 32 位小写十六进制输出
注意事项与边界提醒
BigInt 不支持小数、不能参与 Math 函数、JSON.stringify 会报错。轻量库应提供配套工具:
- 导出为 JSON-safe 格式:用
{ type: 'int128', value: '123456789...' }结构 - 与
Number互转仅限安全整数范围(Number.MAX_SAFE_INTEGER) - 所有位运算(
&,|,^,, <code>>>>)均需后缀n,库中可封装为方法避免手写
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










