Skip to content

Latest commit

 

History

History
70 lines (48 loc) · 7.41 KB

Exploring JavaScripts Numeric Type BigInt.hy.md

File metadata and controls

70 lines (48 loc) · 7.41 KB

Ինչ տարբերություններ կան BigInt և Number տվյալների տիպերի միջև: Number տիպի ո՞ր թերությունները ստիպեցին JavaScript ծրագրավորման լեզվում ավելացնել նոր տվյալների տիպը՝ BigInt-ը:

BigInt-ը համեմատաբար նոր թվային պրիմիտիվ տիպ է JavaScript-ում, որը թույլ է տալիս աշխատել կամայական մեծության ամբողջ թվերի հետ։ BigInt-ի շնորհիվ մենք կարող ենք անվտանգ պահպանել և մշակել ամբողջ թվային տվյալներ, որոնք դուրս են Number թվային տիպի արժեքների թույլատրելի միջակայքից։

Հիշեցնեմ, որ Number թվային տիպը հիշողության մեջ պահպանվում է 64 բիթ IEEE-754 ֆորմատով, որը նաև անվանում են double precision floating point numbers. Այդ ֆորմատը ենթադրում է որ 52 բիթ տրամադրվում է թվի պահպանման, 11 բիթ՝ ոչ ամբողջ մասի կետի դիրքի (եթե ամբողջ թիվ է, ապա այնտեղ 0 է), և 1 բիթը տրամադրվում է նշանի պահպանման համար (բացասական կամ դրական, այստեղից էլ առաջանում է -0-ի հետ կապված կազուսը): Այս ֆորմատը մեծամասամբ բավարարում է առօրյա անհրաժեշտ խնդիրների մեծ մասի լուծմանը, և բավականին հարմար ֆորմատ է։

Սակայն այն ունի նաև մի շարք թերություններ։ Միջակայքը, որում կարելի է ճշգրիտ ու անվտանգ թվաբանական գործողություններ անել, սահմանափակվում է -(2^53 - 1)-ից մինչև 2^53 - 1։ Այս ֆորմատի յուրահատկությունը նաև այն է, որ առաջանում է 2 տեսակի զրո, դրական և բացասական(0 և -0),ինչը մաթեմատիկայի տեսանկյունից անհեթեթություն է։ Եվ թեև ինտերպրետատորն այդ երկու զրոները մեծամասամբ ընդունում է որպես նույնական, այնուամենայնիվ որոշ դեպքերում կարող են անհարմարություններ առաջանալ։

BigInt-ը հնարավորություն է տալիս օգտագործել շատ մեծ ամբողջ թվեր և բարձր ճշգրտության թվաբանական գործողություններ կատարել նրանց հետ։ Որպեսզի ստեղծենք BigInt, անհրաժեշտ է ընդամենը թվային լիտերալի վերջում ավելացնել n տառը։ Օրինակ՝

const sameValue = 42n;

Կարելի է նաև կանչել BigInt ֆունկցիան և նրան որպես արգումենտ տալ ցանկացած սովորական թիվ, որը կարող է լինել ինչպես Number, այնպես էլ String տիպի։ Օրինակ՝

const bigintValue = BigInt(4521451);
const anotherValue = BigInt("2564879");

Թվաբանական գործողությունների ժամանակ BigInt-ը կարելի է օգտագործել որպես սովորական թիվ։ BigInt-ով կատարվելիք գործողությունը վերադարձնում է միայն BigInt: Միաժամանակ միևնույն հաշվարկի մեջ օգտագործել թե՛ BigInt և թե՛ Number չի թույլատրվում։ Օրինակ՝

console.log(2n + 3n); // 5n
console.log(2n + 3); // Uncaught TypeError

Եթե որևէ թվաբանական գործողության արդյունքում ակնկալվում է ոչ ամբողջ թիվ, ապա գործողության արդյունքից ոչ ամբողջ մասը դեն է նետվում։ BigInt-ը կարող է լինել միայն ամբողջ թիվ, ինչն անվանումից էլ արդեն պարզ է (big integer): Օրինակ՝

console.log(5n / 2n); // 2n

Քանի որ BigInt-ն առանձին տիպ է, Number կամ թվային արժեք պարունակող String տիպի հետ խիստ հավասարության ստուգման դեպքում, երբ տիպերի փոխակերպում չի կատարվում` համեմատությունը միշտ կլինի false: Օրինակ՝

console.log(25 === 25n); // false
console.log("25" === 25n); // false

Ոչ խիստ հավասարության ստուգման դեպքում կկատարվի տիպերի անուղղակի փոխակերպում, ինչի արդյունքում կունենանք վերևի օրինակից տարբերվող արդյունք՝

console.log(25 == 25n); // true
console.log("25" == 25n); // true

Երբ BigInt թվային արժեքը ուղղակիորեն փոխակերպվում է բուլյան տիպի, այդ փոխակերպումը ոչ մի բանով չի տարբերվում Number տիպի համապատասխան արժեքի փոխակերպումից։ Օրինակ բոլոր այս դեպքերում՝ if, while, for, &&, || , Boolean ֆունկցիա.

if (0n) {
  console.log("if");
} else {
  console.log("else");
} // կտպի else, քանի որ 0n-ը falsy արժեք է։

0n && 5; // 0n, առաջին falsy արժեքն է։
0n || 8n; // 8n, առաջին truty արժեքն է։

Հիմնական օպերատորների մեծ մասը BigInt-ի հետ կարելի է կիրառել, օրինակ բինար + - / * ** %։ Բիթային օպերացիաների օպերատորները նույնպես կարող են հաջողությամբ կիրառվել( | & << >> և ^ )։ Ունար մինուսը կարող է կիրառվել բացասական BigInt սահմանելու համար (օրինակ՝ -8n), սակայն ունար պլյուսը չի կարող օգտագործվել և օգտագործելու պարագայում կունենանք TypeError:

Եզրափակելով կարելի է ասել, որ առօրյա խնդիրների ճնշող մեծամասնության մեջ մենք դժվար թե առիթ ունենանք կիրառել BigInt, քանի որ Number տիպը հիանալիորեն կարողանում է լուծել JavaScript ծրագրավորողի առջև դրված խնդիրների մեծ մասը։ Բայց որոշ սպեցիֆիկ դեպքերում, երբ անհրաժեշտ է գործ ունենալ շատ մեծ ամբողջ թվերի հետ, կոդում մենք կարող եք հանդիպել BigInt-ի կիրառությանը։ Նաև պետք է հաշվի առնել, որ այն ներդրվել է ստանդարտ համեմատաբար վերջերս, և շատ բրաուզերներ կարող են այն չսպասարկել։

Ներքևի հղումներով կարող եք ծանոթանալ տվյալների այս նոր տիպի սպեցիֆիկացիային և նաև տեսնել, թե որ բրաուզերների ինչ տարբերակներ են սպասարկում այն։

BigInt Specification
BigInt Browser Support