به آموزشگاه مجازی سینا خوش آمدید!

آموزش BigInt در جاوا اسکریپت

امتیاز
(0)

BigInt در جاوا اسکریپت چیست؟

BigInt یک نوعِ داده در جاوا اسکریپت، برای به کار بردن و ذخیره‌ی مقادیرِ بزرگِ اعداد صحیح(integer) است. 

BigInt به ما امکان می‌دهد تا با اعداد صحیحی که بزرگتر از حدِّ اعداد(limit of Numbers) هستند کار کنیم. 

BigInt می‌تواند یک عدد صحیح با هر سایزی را ارائه دهد؛ که تنها با حافظه‌ی(memory) در دسترس محدود می‌شود. 


دقت جاوا اسکریپت

دقت اعداد در جاوا اسکریپت تنها تا 15 رقم است:

مثال شماره 1

// 15 رقم:
let x = 999999999999999;

// 16 رقم:
let y = 9999999999999999;
امتحان کنید

اعداد(Numbers) در جاوا اسکریپت، اعداد ممیز شناورِ 64 بیت هستند

تمام اعداد در جاوا اسکریپت در قالب اعداد 64 بیت ممیز شناور ذخیره می شوند(استاندارد IEEE 754). 

با این استاندارد، اعداد بزرگ نمی توانند به طور دقیق نمایش داده شوند، اما گرد خواهند شد. 

جاوا اسکریپت تنها می تواند اعداد صحیح را به صورت امن تا  253-1 (9007199254740991)ارائه دهد. 

جاوا اسکریپت تنها می تواند اعداد صحیح را به صورت امن از -(253 - 1) (-9007199254740991) تا مقدار بالا، ارائه دهد. 

مثال شماره 2

// MAX = 9007199254740991
let x = Number.MAX_SAFE_INTEGER;

// MIN = -9007199254740991
let y = Number.MIN_SAFE_INTEGER;
امتحان کنید

مثال شماره3

اعداد بزرگتر از Number.MAX_SAFE_INTEGER دقت را از دست خواهند داد:

// Max (دقیق)
let x = 9007199254740991;

// Max + 10 (غیر دقیق)
let y = x + 10;
امتحان کنید

مثال شماره 4

اعداد صحیح کوچکتر از Number.MIN_SAFE_INTEGER دقت را از دست خواهند داد:

// Min (دقیق)
let x = -9007199254740991;

// Min - 10 (غیر دقیق)
let y = x - 10;
امتحان کنید

نکته: در جاوا اسکریپت چیزی به نام عدد صحیح وجود ندارد. تمام اعداد جاوا اسکریپت، اعداد 64 بیتِ ممیز شناور هستند. 


چگونه یک BigInt ایجاد کنیم؟

به دو طریق می توانیم یک BigInt ایجاد کنیم:

  • با استفاده از یک عدد صحیح با یک پسوند n.
  • با استفاده از سازنده یا کانستراکتور BigInt() با یک رشته(می تواند یک رشته ی عددی باشد)

مثال شماره 5

// n استفاده از یک عدد صحیح به همراه پسوند:
let x = 999999999999999n;

// به همراه یک رشته BigInt() استفاده از سازنده ی 
let y = BigInt("999999999999999");
امتحان کنید

مثال شماره 6

let x = 12345678901234567890n;
let y = BigInt("12345678901234567890")
امتحان کنید

ما همچنین می توانیم با استفاده از سازنده‌ی Bigint() و یک عدد(Number)، یک BigInt ایجاد کنیم. 

هشدار: اعداد(Numbers) تنها تا 15 رقم دقیق هستند. 

مثال شماره 7

 let x = BigInt(9999999999999999);
امتحان کنید

BigInt یک نوعِ داده در جاوا اسکریپت است

اگر از دستور typeof روی یک BigInt استفاده کنیم، مقدار "bigint" برگردانده می شود:

مثال شماره 8

let x = BigInt(999999999999999);

let type = typeof x;
امتحان کنید

BigInt دومین نوعِ داده در جاوا اسکریپت(پس از Number) است. 

با BigInt تعداد نوعِ داده هایی که در جاوا اسکریپت پشتیبانی می شوند برابر با 8 مورد زیر می شود:

1. String
2. Number
3. Bigint
4. Boolean
5. Undefined
6. Null
7. Symbol
8. Object 


عملگرهای حسابی در جاوا اسکریپت

BigInt از عملگرهای حسابی استاندارد در جاوا اسکریپت پشتیبانی می کند. 

(+, -, ++, --, *, /, %, **)

مثال شماره 9

ضرب:

let x = 9007199254740995n;
let y = 9007199254740995n;

let z = x * y;
امتحان کنید

ترکیب BigInt و اعداد(Numbers)

عملیات ریاضی بین یک BigInt و یک عدد مجاز نیست(باعث ایجاد خطای TypeError می شود). 

برای انجام این کار، باید ابتدا یک تبدیل صریح(Explicit) انجام شود. 

مثال شماره 10

ما نمی توانیم مستقیماً BigInt و اعداد(Number) را مخلوط کنیم:

let x = 10n;
let y = 5;

let z = x + y; // ❌ TypeError 

برای حل این مشکل، به طور صریح یکی را تبدیل می کنیم:

let x = 10n;
let y = 5;

let z = Number(x) + y;
امتحان کنید

تبدیلات BigInt و Number در جاوا اسکریپت

تبدیل BigInt به Number : از سازنده‌ یا همان کانستراکتور Number() استفاده کنید. 

تبدیل Number به BigInt : از سازنده ی  BigInt() استفاده کنید. 

مثال شماره 11

// BigInt ایجاد یک
let largeNumber = BigInt("12345678901234567890");

// انجام تبدیلات
let num = Number(largeNumber);
امتحان کنید

BigInt های بزرگ هنگامی که به یک عدد(number) تبدیل می شوند، ممکن است به بینهایت منجر شوند یا دقت خود را از دست بدهند. 


اعشار برای BigInt

یک BigInt نمی تواند اعشار داشته باشد. 

let x = 1.5n; // ❌ TypeError

مثال شماره 12

مثالی از تقسیم BigInt:

let x = 5n;
let y = x / 2;
// ❌ Error: Cannot mix BigInt and other types, use explicit conversion.

نتیجه:

let x = 5n;
let y = Number(x) / 2;
امتحان کنید

نکته: تلاش برای تبدیل یک عدد با قسمت اعشاری به یک BigInt باعث ایجاد خطا خواهد شد.


عملگرهای مقایسه ای

Bigint از عملگرهای مقایسه‌ایِ استاندارد پشتیبانی می‌کند:

(<, > ==, ===, !==, <=, >=)

BigInt ها همچنین می توانند با استفاده از عملگرهای مقایسه ایِ استاندارد، با Numberها مورد مقایسه قرار گیرند. 

مثال شماره 13

مقایسه ها به طور عادی کار می کنند:

// true
let x = (10n > 5n);

// false (زیرا نوع آنها متفاوت است، پس دقیقا با هم برابر نیستند)
let y = (10n === 10);

// true (برابری)
let z = (10n == 10);
امتحان کنید

نکته: برابری دقیق(===) بین یک BigInt و یک Number همواره ارزش false دارد چون نوع آنها با یکدیگر متفاوت است. 


عملگرهای بیتی

BigInt از عملیات های بیتی پشتیبانی می کند اما تنها با دیگر BigIntها(نه با اعداد یا همان Numbers). 

  • & (AND)
  • | (OR)
  • ^ (XOR)
  • ~ (NOT)

مثال شماره 14

let a = 5n; // 0101
let b = 3n; // 0011

let x = (a & b); // 1n (0001)
let y = (a | b); // 7n (0111)
let z = (a ^ b); // 6n (0110)
let n = (~a);    // -6n
امتحان کنید

عملگرهای شیفتِ بیتی

BigInt تنها از دو عملگر شیفت پشتیبانی می کند:

  • >> (شیفت به چپ)
  • << (شیفت به راست علامت دار)

مثال شماره 15

let big = 10n; // binary: 1010

let x = (big << 2n); // 40n (101000)
let y = (big >> 1n); // 5n (0101)
امتحان کنید

قوانین مهم:

  1. هردوی عملوندها باید BigInt باشند.
  2. مقدار شیفت نباید منفی باشد.
  3. شیفت سمت راست، برای مقادیر منفی، از بیتِ علامت نگهداری می کند. 

نکته: شیفت به راست بدون علامت(<<<) با BigIntها مجاز نیست. 


BigInt ها به صورت Hex و Octal و Binary

BigInt ها را همچنین می توانیم به صورت هگزادسیمال(hexadecimal)، اُکتال(octal) یا باینری(binary) بنویسیم. 

لیترال های bigint مانند اعداد از چندین مبنا(base) پشتیبانی می کنند:

    Normal: 256n
    Octal: 0o400n
    Hexadecimal: 0x100n
    Binary: 0b100000000n

مثال شماره 16

let num = 256n;
let oct = 0o400n;
let hex = 0x100n;
let bin = 0b100000000n;
امتحان کنید

مثال شماره 17

let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;
امتحان کنید

دقت غیر معمولی(Precision Curiosity)

ماکزیمم عدد صحیح امن در جاوا اسکریپت برابر است با 9007199254740991.

گرد کردن می‌تواند امنیت برنامه را به خطر بیندازد:

مثال شماره 18

9007199254740992 === 9007199254740993; // is true !!! 
امتحان کنید

مثال شماره 19

 9007199254740992n === 9007199254740993n; // is false !!! 
امتحان کنید

خلاصه‌ی مطلب

  1. BigInt به ما امکان می دهد تا اعداد صحیح با دقت نامحدود داشته باشیم. 
  2. اعداد BigInt می توانند هرچه که حافظه‌ی رایانه امکان دهد، بزرگ یا کوچک باشند. 
  3. BigInt ها برای کار با اعداد صحیح بسیار بزرگ مورد استفاده قرار می گیرند(در رمز نگاری و زمان سنجی و غیره).
  4. BigInt برای اعشارها مناسب نیست-تنها برای اعداد صحیح مناسب است.
  5. تابع های ریاضی(مثل Math.sqrt()) با BigIntها کار نمی کنند. 
  6. دستور JSON.stringify() نمی تواند BigIntها را به کار ببرد-یک خطا ایجاد می کند. 

پشتیبانی مرورگرها

BigInt() یک ویژگی است که در اکما اسکریپت 2020 (ES2020)معرفی شده است. 

اکما اسکریپت 2020 (ES2020) در تمام مرورگرهای مدرن از سپتامبر 2020 پشتیبانی می شود. 

Chrome
85
Edge
85
Firefox
79
Opera
71
Safari
14
Aug 2020 Aug 2020 Mar 2020 Sep 2020 Sep 2020

 


منبع: www.w3schools.com/js

 

  • بازدید: 37

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.

ارسال