BigInt
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2020å¹´9æ.
BigInt ã¯ã大ãããã¦ã¾ãã¯å°ãããã¦æ°å¤ (number) ããªããã£ãã§è¡¨ããã¨ãã§ããªãæ°ã表ç¾ãã¾ãã
解説
BigInt å¤ã¯ãåã« BigInt ã¨å¼ã°ãããã¨ãããã¾ãããé·æ´æ° (bigint) ããªããã£ãã§ããæ´æ°ãªãã©ã«ã®æ«å°¾ã« n ã追å ããããBigInt() ã³ã³ã¹ãã©ã¯ã¿ã¼ãå¼ã³åºããæ´æ°å¤ã¾ãã¯æååå¤ãä¸ãããã¨ã§çæãããã¨ãã§ãã¾ãï¼ãã ã new æ¼ç®åãªãã§ï¼ã
const previouslyMaxSafeInteger = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// 9007199254740991n
const hugeString = BigInt("9007199254740991");
// 9007199254740991n
const hugeHex = BigInt("0x1fffffffffffff");
// 9007199254740991n
const hugeOctal = BigInt("0o377777777777777777");
// 9007199254740991n
const hugeBin = BigInt(
"0b11111111111111111111111111111111111111111111111111111",
);
// 9007199254740991n
é·æ´æ°ã¯ããã¤ãã®ç¹ã§æ°å¤ã¨ä¼¼ã¦ãã¾ãããéè¦ãªããã¤ãã®ç¹ãç°ãªãã¾ããçµã¿è¾¼ã¿ã® Math ãªãã¸ã§ã¯ãå
ã®ã¡ã½ããã§ã¯å©ç¨ã§ãããæ¼ç®ã§æ°å¤ã¨æ··ãããã¨ãã§ãã¾ãããåãåã«çµ±ä¸ããå¿
è¦ãããã¾ãããã ããé·æ´æ°ãæ°å¤ã¸å¤æããéã«ã¯ç²¾åº¦ãè½ã¡ããã¨ãããã®ã§ãç¸äºã«å¤æããå ´åã«ã¯æ³¨æãå¿
è¦ã§ãã
åæ å ±
typeof ã®é·æ´æ°å¤ (bigint ããªããã£ã) ã«å¯¾ããè©ä¾¡å¤ã¯ã"bigint" ã¨ãªãã¾ãã
typeof 1n === "bigint"; // true
typeof BigInt("1") === "bigint"; // true
é·æ´æ°å¤ã¯ Object ã§ã©ãããããã¨ãã§ãã¾ãã
typeof Object(1n) === "object"; // true
æ¼ç®å
以ä¸ã®æ¼ç®åã¯é·æ´æ°å¤ã¾ãã¯ãªãã¸ã§ã¯ãã§ã©ãããã BigInt å¤ã§ä½¿ç¨ãããã¨ãã§ãã¾ãã
- ç®è¡æ¼ç®å:
+,-,*,/,%,** - ãããæä½æ¼ç®å:
>>,<<,&,|,^,~ - åé
ãã¤ãã¹ (
-) - ã¤ã³ã¯ãªã¡ã³ã/ãã¯ãªã¡ã³ã:
++,--
è«çå¤ãè¿ãæ¼ç®åã¯ãæ°å¤ã¨é·æ´æ°ããªãã©ã³ãã¨ãã¦æ··åã§ãã¾ãã
- æ¯è¼æ¼ç®åããã³ç価æ¼ç®å:
>,<,>=,<=,==,!=,===,!== - è«çæ¼ç®åã¯ãªãã©ã³ãã®çå¤ã§ãããã©ããã®ã¿ãå¦çãã¾ãã
é·æ´æ°ã§ã¯å ¨ã対å¿ãã¦ããªãæ¼ç®åã 2 ã¤ããã¾ãã
- åé
ãã©ã¹ (
+) ã¯ãasm.js ã§ã®ä½¿ç¨æ³ã¨ç«¶åãããããµãã¼ãã§ãããasm.js ãå£ããªãããã«é¤å¤ããã¦ãã¾ãã - 符å·ãªãå³ã·ãã (
>>>)ã¯ããããæ¼ç®åã§å¯¾å¿ãã¦ããªãå¯ä¸ã®ãã®ã§ãããã¹ã¦ã®é·æ´æ°ã符å·ã¤ãã ããã§ãã
ç¹æ®ãªå ´åãããã¾ãã
- æååã¨é·æ´æ°ã®å ç® (
+) ã¯ãæååãè¿ãã¾ãã - é¤ç® (
/) ã¯å°æ°é¨åã0æ¹åã«åãæ¨ã¦ã¾ããé·æ´æ°ã¯å°æ°é¨åã表ç¾ã§ããªãããã§ãã
const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER); // 9007199254740991n
const maxPlusOne = previousMaxSafe + 1n; // 9007199254740992n
const theFuture = previousMaxSafe + 2n; // 9007199254740993nããããåä½ããããã«ãªãã¾ããã
const prod = previousMaxSafe * 2n; // 18014398509481982n
const diff = prod - 10n; // 18014398509481972n
const mod = prod % 10n; // 2n
const bigN = 2n ** 54n; // 18014398509481984n
bigN * -1n; // -18014398509481984n
const expected = 4n / 2n; // 2n
const truncated = 5n / 2n; // 2n ã§ããã 2.5n ã§ã¯ãªã
æ¯è¼æ¼ç®
é·æ´æ°å¤ã¯æ°å¤ã¨å³å¯ç価ã§ã¯ããã¾ããããç価ã«ã¯ãªãã¾ãã
0n === 0; // false
0n == 0; // true
æ°å¤ã¨é·æ´æ°å¤ã¯é常éãæ¯è¼ã§ãã¾ãã
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 ]
mixed.sort((a, b) => a - b);
// åãæ··å¨ããæ¸ç®ã¯ã§ããªãã®ã§åä½ããªã
// TypeError: can't convert BigInt value to Number value
// é©åãªæ°å¤æ¯è¼é¢æ°ã使ç¨ããä¸¦ã¹æ¿ã
mixed.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
// [ -12n, 0, 0n, 4n, 4, 6, 10 ]
ãªããObject ã«ã©ãããããé·æ´æ°ã¯ä»ã®ãªãã¸ã§ã¯ãã¨åæ§ã®æ¯ãèãããã¾ããåãã¤ã³ã¹ã¿ã³ã¹åå£«ãæ¯è¼ãããå ´åã«ã®ã¿ç価ã¨ãªãã¾ãã
Object(0n) === 0n; // false
Object(0n) === Object(0n); // false
const o = Object(0n);
o === o; // true
æ°å¤ã¨é·æ´æ°ã®å夿ã¯ç²¾åº¦ãè½ã¡ãå¯è½æ§ããããããæ¬¡ã®ãã¨ãæ¨å¥¨ãã¾ãã
- é·æ´æ°ã¯ãå¤ã 253 ãè¶ ãããã¨ãåççã«äºæ³ãããå ´åã«ã®ã¿ä½¿ç¨ããã
- é·æ´æ°ã¨æ°å¤ã®éã§å夿ãè¡ããªãã
æ¡ä»¶å¼
é·æ´æ°ã¯æ¬¡ã®ãããªå ´åã¯æ°å¤ã®ããã«åä½ãã¾ãã
Booleanã¸å¤æãããå ´åï¼Boolean颿°ã使ç¨ãã¦ï¼- è«çæ¼ç®åã®
||ã&&ã!ã¨ä¸ç·ã«ä½¿ç¨ãããå ´å - ã¾ãã¯
ifæã®ãããªæ¡ä»¶å¼ã®ä¸ã§ä½¿ç¨ãããå ´å
ã¤ã¾ãã0n ã®ã¿ãå½å¤ã§ãä»ã®ãã¹ã¦ã¯çå¤ã¨ãªãã¾ãã
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
æå·å¦ç
é·æ´æ°ã§å¯¾å¿ãã¦ããæ¼ç®ã¯ãå®è¡æéãä¸å®ã§ã¯ãªãã®ã§ãã¿ã¤ãã³ã°æ»æãåããå¯è½æ§ãããã¾ãããããã£ã¦ãç·©åè¦å ããªããã° JavaScript ã®é·æ´æ°ãæå·å¦çã§ä½¿ãã®ã¯å±éºãªå¯è½æ§ãããã¾ããé常ã«ä¸è¬çãªä¾ã¨ãã¦ãæ»æè
㯠101n ** 65537n 㨠17n ** 9999n ã®æéå·®ãè¨æ¸¬ããçµéæéã«ãã¨ã¥ãã¦ç§å¯éµã®ãããªç§å¿æ
å ±ã®å¤§ãããæ¨å®ãããã¨ãã§ãã¾ããããããã§ãé·æ´æ°ã使ç¨ããªããã°ãªããªãå ´åã¯ããã®åé¡ã«é¢ããä¸è¬çãªã¢ããã¤ã¹ãæ²è¼ããã¦ããã¿ã¤ãã³ã°æ»æã®FAQãã覧ãã ããã
JSON ã§ã®ä½¿ç¨
JSON.stringify() ãé·æ´æ°ã«å¯¾ãã¦ä½¿ç¨ãã㨠TypeError ãçºçãã¾ããé·æ´æ°ã¯æ¢å®ã§ JSON ã®ã·ãªã¢ã©ã¤ãºã«å¯¾å¿ãã¦ããªãããã§ãããã ããJSON.stringify() ã¯ç¹å¥ã«é·æ´æ°ã«å¯¾ããè£å£ãæ®ãã¦ãããé·æ´æ°ã® toJSON() ã¡ã½ãããå¼ã³åºããã¨ãã¾ãï¼ä»ã®ããªããã£ãå¤ã«å¯¾ãã¦ã¯ãããã¾ããï¼ããããã£ã¦ãèªèº«ã§ toJSON() ã¡ã½ãããå®è£
ãããã¨ãã§ãã¾ãï¼çµã¿è¾¼ã¿ã«ãªãã¸ã§ã¯ãã«ããããå½ã¦ããã¨ãæç¢ºã«ææ¢ããã¦ããªãæ°å°ãªãä¾ã®ä¸ã¤ï¼ã
BigInt.prototype.toJSON = function () {
return { $bigint: this.toString() };
};
ã¨ã©ã¼ãçºçããããããã«ãJSON.stringify() ã¯æ¬¡ã®ãããªæååãçæãã¾ãã
console.log(JSON.stringify({ a: 1n }));
// {"a":{"$bigint":"1"}}
ãã BigInt.prototype ã«ããããå½ã¦ãããªãå ´åã¯ãé·æ´æ°ã®ã·ãªã¢ã©ã¤ãºã« JSON.stringify() ã® replacer 弿°ã使ããã¨ãã§ãã¾ãã
const replacer = (key, value) =>
typeof value === "bigint" ? { $bigint: value.toString() } : value;
const data = {
number: 1,
big: 18014398509481982n,
};
const stringified = JSON.stringify(data, replacer);
console.log(stringified);
// {"number":1,"big":{"$bigint":"18014398509481982"}}
é·æ´æ°ã«ãªããã¨ãããã£ã¦ããå¤ãå«ã JSON ãã¼ã¿ãããå ´åã¯ãJSON.parse ã® reviver 弿°ã使ã£ã¦å¯¾å¦ãããã¨ãã§ãã¾ãã
const reviver = (key, value) =>
value !== null &&
typeof value === "object" &&
"$bigint" in value &&
typeof value.$bigint === "string"
? BigInt(value.$bigint)
: value;
const payload = '{"number":1,"big":{"$bigint":"18014398509481982"}}';
const parsed = JSON.parse(payload, reviver);
console.log(parsed);
// { number: 1, big: 18014398509481982n }
ã¡ã¢:
JSON.stringify() ã® replacer ãæ±ç¨çã«ãããã¹ã¦ã®ãªãã¸ã§ã¯ãã«å¯¾ãã¦é·æ´æ°ãé©åã«ã·ãªã¢ã©ã¤ãºããããã¨ãå¯è½ã§ããã®ã«å¯¾ããJSON.parse() ã® reviver ã¯æå¾
ãããã¼ã¿æ¬ä½ã®å½¢ã«ç¹åãã¦ããªããã°ãªãã¾ãããã¨ããã®ããã·ãªã¢ã©ã¤ãºã¯éå¯éçã ããã§ããã¤ã¾ãé·æ´æ°ã表ç¾ããæååã¨éå¸¸ã®æååãåºå¥ãããã¨ã¯ã§ãã¾ããã
ããã«ãä¸è¨ã®ä¾ã§ã¯ç½®æã¨å¾©å æã«ãªãã¸ã§ã¯ãå ¨ä½ãçæããããã夿°ã®é·æ´æ°ãå«ãå¤§è¦æ¨¡ãªãªãã¸ã§ã¯ãã§ã¯ããã©ã¼ãã³ã¹ãã¹ãã¬ã¼ã¸ã«å½±é¿ããå¯è½æ§ãããã¾ãããã¼ã¿æ¬ä½ã®å½¢ãåãã£ã¦ããå ´åã¯ã代ããã«æååã¨ãã¦ã·ãªã¢ã©ã¤ãºããããããã£ãã¼åã«åºã¥ãã¦å¾©å ããæ¹ãè¯ãå ´åãããã¾ãã
å®éãJSON ã§ã¯ä»»æã®é·ãã®æ°å¤ãªãã©ã«ã許å¯ããã¦ãã¾ãããã ããJavaScript ã§ã¯å®å ¨ãªç²¾åº¦ã§è§£æã§ããªãã ãã§ããããé·ãæ´æ°ï¼64 ãããæ´æ°ãªã©ï¼ã«å¯¾å¿ãã¦ããè¨èªã§åä½ããå¥ã®ããã°ã©ã ã¨éä¿¡ããå ´åãé·æ´æ°ã JSON æååã§ã¯ãªã JSON æ°å¤ã¨ãã¦éä¿¡ãããå ´åã¯ãæå¤±ã®ãªãæ°å¤ã®ã·ãªã¢ã©ã¤ãºãåç §ãã¦ãã ããã
é·æ´æ°ã®å¤æ
é·æ´æ°ãæå¾ ããå¤ãã®çµã¿è¾¼ã¿æ¼ç®ã¯ãã¾ã弿°ãé·æ´æ°ã«å¤æãã¾ããæ¼ç®ã¯ä»¥ä¸ã®ããã«è¦ç´ã§ãã¾ãã
- é·æ´æ°ã¯ãã®ã¾ã¾è¿ãããã
undefinedã¨nullã¯TypeErrorãçºçãããtrueã¯1nã«ãªããfalseã¯0nã«ãªãã- æååã¯æ´æ°ãªãã©ã«ãå«ããã®ããã«è§£æããã夿ããããè§£æã«å¤±æããã¨
SyntaxErrorãçºçããããã®æ§æã¯æååã®æ°å¤ãªãã©ã«ã®ãµãã»ããã§ãããå°æ°ç¹ãææ°è¨å·ã¯è¨±å¯ããã¾ããã - æ°å¤ã¯
TypeErrorãçºçããã精度ã®ä½ä¸ãå¼ãèµ·ããæå³ããªãæé»ã®å¤æãé²ãã - ã·ã³ãã«ã¯
TypeErrorãçºçãããã - ãªãã¸ã§ã¯ãã¯ã¾ãã
[Symbol.toPrimitive]()ï¼"number"ããã³ãã«æå®ï¼ãvalueOf()ãtoString()ã®é ã«ã¡ã½ãããå¼ã³åºãã¦ããªããã£ã夿ãããããã®çµæã®ããªããã£ãã¯é·æ´æ°ã«å¤æãããã
JavaScript ã§ã»ã¼åã广ãå¾ãæè¯ã®æ¹æ³ã¯ãBigInt() 颿°ã使ããã¨ã§ããBigInt(x) ã¯åãã¢ã«ã´ãªãºã ã使ã£ã¦ x ã夿ãã¾ãããæ°å¤ã TypeError ãçºçããããæ´æ°ã§ããã°é·æ´æ°ã«å¤æãããç¹ãç°ãªãã¾ãã
é·æ´æ°ãæå¾
ããçµã¿è¾¼ã¿æ¼ç®ã¯ã夿å¾ã«é·æ´æ°ãåºå®å¹
ã«åãè©°ãããã¨ãå¤ããã¨ã«æ³¨æãã¦ãã ããããã㯠BigInt.asIntN() 㨠BigInt.asUintN() ãããã³ BigInt64Array 㨠BigUint64Array ã®ã¡ã½ãããå«ã¿ã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã¼
BigInt()-
é·æ´æ°åã®ããªããã£ãå¤ãè¿ãã¾ãã
newã§å¼ã³åºãããå ´åãã¨ã©ã¼ãçºçãã¾ãã
éçã¡ã½ãã
BigInt.asIntN()-
é·æ´æ°å¤ã符å·ä»ãæ´æ°å¤ã«ä¸¸ãããã®å¤ãè¿ãã¾ãã
BigInt.asUintN()-
é·æ´æ°å¤ã符å·ãªãæ´æ°å¤ã«ä¸¸ãããã®å¤ãè¿ãã¾ãã
ã¤ã³ã¹ã¿ã³ã¹ããããã£
以ä¸ã®ããããã£ã¯ BigInt.prototype ã§å®ç¾©ããã¦ããããã¹ã¦ã® BigInt ã¤ã³ã¹ã¿ã³ã¹ã§å
±æããã¾ãã
BigInt.prototype.constructor-
ã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ãã使ããã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã
BigIntã¤ã³ã¹ã¿ã³ã¹ã®å ´åãåæå¤ã¯BigIntã³ã³ã¹ãã©ã¯ã¿ã¼ã§ãã BigInt.prototype[Symbol.toStringTag]-
[Symbol.toStringTag]ããããã£ã®åæå¤ã¯æåå"BigInt"ã§ãããã®ããããã£ã¯Object.prototype.toString()ã§ä½¿ããã¾ãããã ããBigIntãç¬èªã®toString()ã¡ã½ããããã¤ã®ã§ãthisArgã¨ãã¦é·æ´æ°ãæå®ãã¦Object.prototype.toString.call()ãå¼ã³åºããªãããããã®ããããã£ã¯ä½¿ããã¾ããã
ã¤ã³ã¹ã¿ã³ã¹ã¡ã½ãã
BigInt.prototype.toLocaleString()-
ãã®é·æ´æ°å¤ã®è¨èªã«åããã表ç¾ã®æååãè¿ãã¾ãã
Object.prototype.toLocaleString()ã¡ã½ããã䏿¸ããã¾ãã BigInt.prototype.toString()-
ãã®é·æ´æ°å¤ãæå®ãããåºæ°ã§è¡¨ç¾ããæååãè¿ãã¾ãã
Object.prototype.toString()ã¡ã½ããã䏿¸ããã¾ãã BigInt.prototype.valueOf()-
ãã®é·æ´æ°å¤ãè¿ãã¾ãã
Object.prototype.valueOf()ã¡ã½ããã䏿¸ããã¾ãã
ä¾
>ç´ æ°ã®è¨ç®
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;
}
// 弿°ã¨ãã¦é·æ´æ°ãåãã nth çªç®ã®ç´ æ°ãé·æ´æ°ã¨ãã¦è¿ãã¾ãã
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()ã®å®è£
ã¯ããã¾ã§ãã¢ã³ã¹ãã¬ã¼ã·ã§ã³ç¨ã§ããå®éã®ã¢ããªã±ã¼ã·ã§ã³ã§ã¯ãç¹°ãè¿ãè¨ç®ãé¿ãããããã¨ã©ãã¹ããã¹ã®ç¯©ã®ãããªé«åº¦ãªã¡ã¢ãªã¼ã¢ã«ã´ãªãºã ãé©ç¨ãã¹ãã§ãã
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-bigint-objects> |