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
الإضافية ، لذلك يجب توخي الحذر في مثل هذه التحويلات.
bigints
In 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…)