JavaScript-ում BigInt-ը
JavaScript-ում BigInt: Ամբողջ թվերի նոր չափանիշը
JavaScript-ում երկար տարիներ ամբողջ թվերի սահմանափակությունը խնդիր էր առաջացնում մեծ թվերի հետ աշխատելիս։ Սակայն ECMAScript 2020-ը բերեց նոր տվյալների տիպ՝ BigInt, որը թույլ է տալիս աշխատել կամայական մեծությամբ ամբողջ թվերի հետ։
Այս հոդվածում կքննարկենք․
BigInt-ը նոր primitive տիպ է JavaScript-ում, որը թույլ է տալիս պահել ամբողջ թվեր, որոնք շատ մեծ են, քան Number տիպը կարող է։
JavaScript-ի սովորական Number տիպը հիմքում ունի IEEE 754 դաբլ-պրեսիզիայի floating-point, և ապահովում է մինչև Number.MAX_SAFE_INTEGER (2⁵³ - 1), այսինքն՝ 9007199254740991։ Դրանից դուրս կարող են առաջանալ անճշտություններ։
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
console.log(Number.MAX_SAFE_INTEGER + 1); // 9007199254740992
console.log(Number.MAX_SAFE_INTEGER + 2); // 9007199254740992 😱
Այստեղ արդեն տեսնում ենք ճշգրտության կորուստ։
BigInt-ներ ստեղծելու երկու հիմնական եղանակ կա՝
const big = 1234567890123456789012345678901234567890n;
Պարզապես ամբողջ թվին ավելացնում ենք n վերջում։
const big = BigInt("1234567890123456789012345678901234567890");
Կարող ենք փոխանցել նաև string կամ number։
BigInt-ով կարող ենք կատարել հիմնական մաթեմատիկական գործողությունները՝
const a = 1234567890123456789012345678901234567890n;
const b = 987654321098765432109876543210987654321n;
console.log(a + b); // գումարում
console.log(a - b); // հանում
console.log(a * b); // բազմապատկում
console.log(a / b); // բաժանում (կլորացնում է դեպի 0)
console.log(a % b); // մնացորդ
ՈՒշադրություն՝ BigInt-ի բաժանումը միշտ կլորացնում է դեպի 0, նույնիսկ եթե բաժանումը ունի մնացորդ։
JavaScript-ը չի թույլատրում ուղղակիորեն խառնել Number-ը և BigInt-ը նույն գործողության մեջ։
const big = 10n;
const num = 5;
console.log(big + num); // TypeError
Եթե ուզում ենք համադրենք, պետք է միավորենք տիպերը։ Օրինակ՝
console.log(big + BigInt(num));
console.log(Number(big) + num);
Երբ փորձենք serialize անել BigInt-ը JSON-ով, կստանանք սխալ։
JSON.stringify({ value: 123n }); // TypeError
Պետք է նախ վերածենք String-ի կամ Number-ի
JSON.stringify({ value: String(123n) }); // "{\"value\":\"123\"}"
typeof 123n; // "bigint"
Կարող ենք համեմատել BigInt և Number (եթե արժեքները համընկնում են)․
123n == 123; // true
123n === 123; // false (տարբեր տիպեր)
BigInt-ները չեն աշխատում որոշ Web API-ների և DOM մանիպուլյացիաների հետ (օրինակ՝ Canvas, WebGL):
Անհնար է օգտագործել Math-ի մեթոդների հետ.
Math.sqrt(25n); // TypeError
Չի կարելի ունենալ BigInt-ներ դեցիմալներով․
10.5n; // SyntaxError