BigInt
åºçº¿
广æ³å¯ç¨
èª 2020å¹´9æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
BigInt æ¯ä¸ç§å
置对象ï¼å®æä¾äºä¸ç§æ¹æ³æ¥è¡¨ç¤ºå¤§äº 2^53 - 1 çæ´æ°ãè¿åæ¬æ¯ Javascript ä¸å¯ä»¥ç¨ Number 表示çæå¤§æ°åãBigInt å¯ä»¥è¡¨ç¤ºä»»æå¤§çæ´æ°ã
æè¿°
å¯ä»¥ç¨å¨ä¸ä¸ªæ´æ°åé¢éåé¢å n çæ¹å¼å®ä¹ä¸ä¸ª BigInt ï¼å¦ï¼10nï¼æè
è°ç¨å½æ° BigInt()ï¼ä½ä¸å
å« new è¿ç®ç¬¦ï¼å¹¶ä¼ éä¸ä¸ªæ´æ°å¼æå符串å¼ã
const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// ⪠9007199254740991n
const hugeString = BigInt("9007199254740991");
// ⪠9007199254740991n
const hugeHex = BigInt("0x1fffffffffffff");
// ⪠9007199254740991n
const hugeBin = BigInt(
"0b11111111111111111111111111111111111111111111111111111",
);
// ⪠9007199254740991n
å®å¨æäºæ¹é¢ç±»ä¼¼äº Number ï¼ä½æ¯ä¹æå 个å
³é®çä¸åç¹ï¼ä¸è½ç¨äº Math 对象ä¸çæ¹æ³ï¼ä¸è½åä»»ä½ Number å®ä¾æ··åè¿ç®ï¼ä¸¤è
å¿
é¡»è½¬æ¢æåä¸ç§ç±»åãå¨ä¸¤ç§ç±»åæ¥åè½¬æ¢æ¶è¦å°å¿ï¼å 为 BigInt åéå¨è½¬æ¢æ Number åéæ¶å¯è½ä¼ä¸¢å¤±ç²¾åº¦ã
ç±»åä¿¡æ¯
ä½¿ç¨ typeof æµè¯æ¶ï¼ BigInt 对象è¿å "bigint" ï¼
typeof 1n === "bigint"; // true
typeof BigInt("1") === "bigint"; // true
ä½¿ç¨ Object å
è£
åï¼ BigInt 被认为æ¯ä¸ä¸ªæ®é "object" ï¼
typeof Object(1n) === "object"; // true
è¿ç®
以䏿ä½ç¬¦å¯ä»¥å BigInt ä¸èµ·ä½¿ç¨ï¼ +ã*ã-ã**ã%ãé¤ >>> ï¼æ 符å·å³ç§»ï¼ä¹å¤ç ä½æä½ ä¹å¯ä»¥æ¯æãå 为 BigInt 齿¯æç¬¦å·çï¼ >>> ï¼æ 符å·å³ç§»ï¼ä¸è½ç¨äº BigIntã为äºå
¼å®¹ asm.jsï¼BigInt 䏿¯æåç® (+) è¿ç®ç¬¦ã
const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER);
// ⪠9007199254740991n
const maxPlusOne = previousMaxSafe + 1n;
// ⪠9007199254740992n
const theFuture = previousMaxSafe + 2n;
// ⪠9007199254740993n, this works now!
const multi = previousMaxSafe * 2n;
// ⪠18014398509481982n
const subtr = multi - 10n;
// ⪠18014398509481972n
const mod = multi % 10n;
// ⪠2n
const bigN = 2n ** 54n;
// ⪠18014398509481984n
bigN * -1n;
// ⪠-18014398509481984n
/ æä½ç¬¦å¯¹äºæ´æ°çè¿ç®ä¹æ²¡é®é¢ã坿¯å 为è¿äºå鿝 BigInt è䏿¯ BigDecimal ï¼è¯¥æä½ç¬¦ç»æä¼åé¶åæ´ï¼ä¹å°±æ¯è¯´ä¸ä¼è¿åå°æ°é¨åã
è¦åï¼å½ä½¿ç¨ BigInt æ¶ï¼å¸¦å°æ°çè¿ç®ä¼è¢«åæ´ã
const expected = 4n / 2n;
// ⪠2n
const rounded = 5n / 2n;
// ⪠2n, not 2.5n
æ¯è¾
BigInt å Number 䏿¯ä¸¥æ ¼ç¸ççï¼ä½æ¯å®½æ¾ç¸ççã
0n === 0;
// ⪠false
0n == 0;
// ⪠true
Number å BigInt å¯ä»¥è¿è¡æ¯è¾ã
1n < 2;
// ⪠true
2n > 1;
// ⪠true
2 > 2;
// ⪠false
2n > 2;
// ⪠false
2n >= 2;
// ⪠true
两è ä¹å¯ä»¥æ··å¨ä¸ä¸ªæ°ç»å å¹¶æåºã
const mixed = [4n, 6, -12n, 10, 4, 0, 0n];
// ⪠[4n, 6, -12n, 10, 4, 0, 0n]
mixed.sort();
// ⪠[-12n, 0, 0n, 10, 4n, 4, 6]
注æè¢« Object å
è£
ç BigInt ä½¿ç¨ object çæ¯è¾è§åè¿è¡æ¯è¾ï¼åªç¨åä¸ä¸ªå¯¹è±¡å¨æ¯è¾æ¶æä¼ç¸çã
0n === Object(0n); // false
Object(0n) === Object(0n); // false
const o = Object(0n);
o === o; // true
æ¡ä»¶
BigInt å¨éè¦è½¬æ¢æ Boolean çæ¶è¡¨ç°è· Number 类似ï¼å¦éè¿ Boolean 彿°è½¬æ¢ï¼ç¨äºäºå
é»è¾è¿ç®ç¬¦ ||ã&& å ! çæä½æ°ï¼æè
ç¨äºå¨å if statement è¿æ ·çæ¡ä»¶è¯å¥ä¸ã
if (0n) {
console.log("Hello from the if!");
} else {
console.log("Hello from the else!");
}
// ⪠"Hello from the else!"
0n || 12n;
// ⪠12n
0n && 12n;
// ⪠0n
Boolean(0n);
// ⪠false
Boolean(12n);
// ⪠true
!12n;
// ⪠false
!0n;
// ⪠true
æé å¨
éææ¹æ³
BigInt.asIntN()-
å° BigInt å¼è½¬æ¢ä¸ºä¸ä¸ª -2^(width-1) ä¸ 2^(width-1) - 1 ä¹é´çæç¬¦å·æ´æ°ã
BigInt.asUintN()-
å°ä¸ä¸ª BigInt å¼è½¬æ¢ä¸º 0 ä¸ 2^(width) - 1 ä¹é´çæ ç¬¦å·æ´æ°ã
å®ä¾æ¹æ³
BigInt.prototype.toLocaleString()-
è¿åæ¤æ°åç language-sensitive å½¢å¼çå符串ãè¦ç
Object.prototype.toLocaleString()æ¹æ³ã BigInt.prototype.toString()-
è¿å以æå®åºæ° (base) 表示æå®æ°åçå符串ãè¦ç
Object.prototype.toString()æ¹æ³ã BigInt.prototype.valueOf()-
è¿åæå®å¯¹è±¡çåºå å¼ãè¦ç
Object.prototype.valueOf()æ¹æ³ã
使ç¨å»ºè®®
>转å
ç±äºå¨ Number ä¸ BigInt ä¹é´è¿è¡è½¬æ¢ä¼æå¤±ç²¾åº¦ï¼å è建议ä»
å¨å¼å¯è½å¤§äº 2^53 æ¶ä½¿ç¨ BigInt ç±»åï¼å¹¶ä¸ä¸å¨ä¸¤ç§ç±»åä¹é´è¿è¡ç¸äºè½¬æ¢ã
å¯ç å¦
ç±äºå¯¹ BigInt çæä½ä¸æ¯å¸¸æ°æ¶é´çï¼å è BigInt ä¸éåç¨äºå¯ç å¦ã
å¨ JSON ä¸ä½¿ç¨
å¯¹ä»»ä½ BigInt å¼ä½¿ç¨ JSON.stringify() é½ä¼å¼å TypeErrorï¼å 为é»è®¤æ
åµä¸ BigInt å¼ä¸ä¼å¨ JSON ä¸åºååã使¯ï¼å¦æéè¦ï¼å¯ä»¥å®ç° toJSON æ¹æ³ï¼
BigInt.prototype.toJSON = function () {
return this.toString();
};
JSON.stringify ç°å¨çæå¦ä¸å符串ï¼è䏿¯æåºå¼å¸¸ï¼
JSON.stringify(BigInt(1));
// '"1"'
示ä¾
>计ç®è´¨æ°
function isPrime(n) {
if (n < 2n) {
return false;
}
if (n % 2n === 0n) {
return n === 2n;
}
for (let factor = 3n; factor * factor <= n; factor += 2n) {
if (n % factor === 0n) {
return false;
}
}
return true;
}
// æ¥æ¶ä¸ä¸ª BigInt å¼åæ°ï¼ä»¥ BigInt å¼è¿å第 n 个质æ°å¼
function nthPrime(nth) {
let maybePrime = 2n;
let prime = 0n;
while (nth >= 0n) {
if (isPrime(maybePrime)) {
nth--;
prime = maybePrime;
}
maybePrime++;
}
return prime;
}
nthPrime(20n);
// 73n
夿³¨ï¼isPrime() å®ç°ä»
便¼ç¤ºãå¨å®é
åºç¨ä¸ï¼ä¸ºäºé¿å
éå¤è®¡ç®ï¼ä¼ä½¿ç¨å¤§éè®°å¿åçç®æ³ï¼ä¾å¦åæææ¯ç¹å°¼çæ³ã
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification > # sec-bigint-objects > |