BigInt هو نوع رقمي خاص يوفر الدعم للأعداد الصحيحة ذات الطول التعسفي.
لإنشاء قيمة من النوع BigInt ، يجب عليك إضافة n إلى نهاية الحرف الرقمي أو استدعاء الدالة BigInt ، والتي ستنشئ عددًا من النوع BigInt من الوسيطة التي تم تمريرها. يمكن أن تكون الوسيطة رقمًا أو سلسلة ، إلخ.
const bigint = 1234567890123456789012345678901234567890n;
const sameBigint = BigInt('1234567890123456789012345678901234567890');
const bigintFromNumber = BigInt(10); // 10n مثلهاعوامل الرياضيات
BigInt يمكن استخدامها في الغالب مثل رقم عادي ، على سبيل المثال:
alert(1n + 2n); // 3
alert(5n / 2n); // 2يرجى ملاحظة : أن القسمة 5/2 ترجع النتيجة مقربة إلى الصفر بدون الجزء العشري. جميع العمليات على BigInts ترجع BigInts.
لا يمكننا مزج الأرقام الكبيرة والأرقام العادية:
alert(1n + 2); // Error: Cannot mix BigInt and other typesيجب علينا تحويلها بشكل صريح إذا لزم الأمر: باستخدام BigInt() أو Number()، مثل هذا :
let bigint = 1n;
let number = 2;
// bigint تحويل number إلى
alert(bigint + BigInt(number)); // 3
// number تحويل bigint إلى
alert(Number(bigint) + number); // 3يحدث تحويل bigint إلى رقم دائمًا بشكل ضمني وبدون توليد أخطاء ، ولكن إذا كانت قيمة bigint كبيرة جدًا ولا تتناسب مع نوع الرقم ، فسيتم تجاهل bits الإضافية ، لذلك يجب توخي الحذر في مثل هذه التحويلات.
bigintsIn order to avoid confusion, it’s not supported on bigints:
let bigint = 1n;
alert(+bigint); // errorلذلك يجب أن نستخدم Number() لتحويل bigint إلى رقم.
المقارنات
تعمل المقارنات ، مثل <،> مع الأحرف الكبيرة والأرقام كالمعتاد:
alert( 2n > 1n ); // true
alert( 2n > 1 ); // trueيرجى ملاحظة أن الأرقام المنتظمة والأرقام الكبيرة تنتمي إلى أنواع مختلفة ، يمكن أن تكون متساوية فقط مع مقارنة ضيقة ==,ولكنها ليست متساوية تمامًا ===:
alert( 1 == 1n ); // true
alert( 1 === 1n ); // falseالعمليات المنطقية
عندما تكون داخل if أو العمليات المنطقية الأخرى ، يتصرفbigints مثل الأرقام.
على سبيل المثال ، في if ، تكون قيمة bigint0n خاطئة ، والقيم الأخرى صحيحة:
if (0n) {
  //  لا ينفذ أبداً
}تعمل عوامل التشغيل المنطقية ، مثل || و & & وغيرها مع bigint المشابهة للأرقام
:
alert( 1n || 2 ); // 1 (1n ستكون `true`)
alert( 0n || 2 ); // 2 (0n ستكون `false`)تعدد الأشكال
تعدد أشكال bigints صعب. والسبب هو أن العديد من عوامل تشغيل JavaScript ، مثل+،- وما إلى ذلك تتصرف بشكل مختلف باستخدام bigints مقارنة بالأرقام العادية.
على سبيل المثال ، يؤدي قسمة رقم bigint إلى إرجاع bigint (يتم تقريبه إذا لزم الأمر).
لمحاكاة مثل هذا السلوك ، سيحتاج الملء المتعدد إلى تحليل الشفرة واستبدال جميع هذه العوامل بوظائفها. لكن القيام بذلك أمر مرهق وسيكلف الكثير من الأداء.
لذا ، لا يوجد “تعدد أشكال” جيد معروف.
على الرغم من ذلك هناك حل عكسي اقترحه مطورو مكتبة JSBI .
تقوم هذه المكتبة بتنفيذ أعداد كبيرة باستخدام أساليبها الخاصة. يمكننا استخدامها بدلاً من “bigints” الأصلية :
| العملية | الأصلية BigInt | JSBI | 
|---|---|---|
| إنشاء من رقم | a = BigInt(789) | a = JSBI.BigInt(789) | 
| الإضافة | c = a + b | c = JSBI.add(a, b) | 
| الطرح | c = a - b | c = JSBI.subtract(a, b) | 
| … | … | … | 
… ثم استخدم “تعدد أشكال” (مكوّن Babel الإضافي) لتحويل مكالمات JSBI إلى bigint الأصلية لتلك المتصفحات التي تدعمها
.
بعبارة أخرى ، يقترح هذا النهج استخدام JSBI بدلاً من BigInt المدمج. تعمل JSBI داخليًا مع الأرقام كما هو الحال مع BigInt ، تحاكيها وفقًا لجميع متطلبات المواصفات. وبالتالي ، يمكننا تنفيذ كود JSBI في المترجمين الذين لا يدعمون Bigint ، وبالنسبة لأولئك الذين يدعمون ، يقوم تعدد الأشكال بتحويل المكالمات إلى Bigint العادية…
يمكننا استخدام رمز JSBI هذا “كما هو” للمحركات التي لا تدعم bigint وتلك التي تدعم – سيقوم تعدد الأشكال بتحويل المكالمات إلى bigint الأصلية
.
المراجع
التعليقات
<code>، وللكثير من السطور استخدم<pre>، ولأكثر من 10 سطور استخدم (plnkr, JSBin, codepen…)