اذهب إلى المحتوى

الأعداد الكبيرة BigInt الجديدة في جافاسكربت


Mohamed Lahlah

تحذير: إضافة حديثة للغة
هذه إضافة حديثة للغة. يمكنك العثور على الحالة الحالية للدعم من هنا.

الأعداد الكبيرة BigInt هو متغيّر عدديّ خاص، يوفر دعمًا للأعداد الصحيحة ذات الطول العشوائي.

تُنشأ الأعداد الكبيرة من خلال إلحاق الحرف n بنهاية العدد العادي، أو من خلال استدعاء الدالّة BigInt والّتي بدورها ستُنشئ عدد كبير من السلاسل أو الأعداد العادية وما إلى ذلك.

const bigint = 1234567890123456789012345678901234567890n;

const sameBigint = BigInt("1234567890123456789012345678901234567890");

const bigintFromNumber = BigInt(10); // ‫مشابه تمامًا للطريقة  10n

المعاملات الرياضية

عمومًا يمكننا استخدام العدد الكبير مثل العدد العادي، فمثلًا:

alert(1n + 2n); // 3

alert(5n / 2n); // 2

الرجاء ملاحظة أن القسمة 5/2 تُعيد نتيجة مُقرّبة للصفر، بدون الجزء العشري. جميع العمليات على الأعداد الكبيرة ستُعيد أعداد كبيرة.

لا يمكننا جمع الأعداد الكبيرة مع الأعداد العادية:

alert(1n + 2); // ‫خطأ: لايمكننا جمع الأعداد الكبيرة مع الأعداد العادية

يجب علينا تحويلها بطريقة واضحة إن لزم الأمر: باستخدام BigInt()‎ أو Number()‎، هكذا:

let bigint = 1n;
let number = 2;

// تحويل عدد عادي إلى عدد كبير
alert(bigint + BigInt(number)); // 3

// تحويل عدد كبير إلى عدد عادي
alert(Number(bigint) + number); // 3

تكون عمليات التحويل صامتة دائمًا، ولا تخطئ أبدًا، ولكن إذا كانت الأعداد الكبيرة ذات حجم كبير جدًا بحيث لن تتناسب مع العدد العادي، فستُحذف البتات الإضافية من العدد الكبير، لذلك يجب أن نكون حذرين عند إجراء مثل هذه التحويلات.

ملاحظة: معامل الجمع الأحادي لا يطبق على الأعداد الكبيرة

المعامل ‎+value: هو طريقة معروفة لتحويل المتغير value إلى رقم.

لا تدعم الأعداد الكبيرة هذه الطريقة لتجنب الفوضى:

let bigint = 1n;

alert( +bigint ); // خطأ

لذلك يجب أن نستخدم Number()‎ لتحويل العدد الكبير إلى عدد عادي.

عمليات الموازنة

تعمل عمليات الموازنة، مثل: < و> مع الأعداد الكبيرة والعادية على حدٍ سواء:

alert( 2n > 1n ); // true

alert( 2n > 1 ); // true

لاحظ أنه نظرًا لأن الأعداد العادية والأعداد الكبيرة تنتميان لأنواع مختلفة، فيمكن أن تكون متساوية ==، ولكن ليست متساوية تمامًا ===:

alert( 1 == 1n ); // true

alert( 1 === 1n ); // false

العمليات المنطقية

تتصرف الأعداد الكبيرة مثل الأعداد العادية عندما تكون fداخل الجملة الشرطية if أو أي عمليات منطقية الأخرى.

فمثلًا، في الجملة الشرطية if أدناه، تكون قيمة 0n خاطئة، والقيم الأخرى صحيحة:

if (0n) {
  // لن يُشغّل مطلقًا
}

تعمل المعاملات المنطقية مثل: || و&& وغيرهما مع الأعداد الكبيرة بطريقة مشابهة للأعداد العادية:

alert( 1n || 2 ); // 1 (1n is considered truthy)

alert( 0n || 2 ); // 2 (0n is considered falsy)

ترقيع مشاكل نقص الدعم

تعد عملية ترقيع الدعم للأعداد الكبيرة صعبة بعض الشيء. والسبب هو أن العديد من معاملات جافاسكربت، مثل: + و - وما إلى ذلك تتصرف بطريقة مختلفة مع الأعداد الكبيرة بالموازنة مع الأعداد العادية.

فمثلًا، تُعيد عملية القسمة على الأعداد الكبيرة دائمًا أعداد كبيرة (وتقربها إن لزم الأمر).

لتنفيذ مثل هذه السلوك عن طريق ترقيع نقص الدعم في هذه الحالة سنحتاج لتحليل الشيفرة واستبدال جميع هذه المعاملات بالدوالّ المناسبة. لكن القيام بذلك أمر مُرهق وسيُكون على حساب انخفاض الأداء.

بالإضافة إلى ذلك لا يوجد طريقة شائعة ومعتمد بين مجتمع المطورين لترقيع نقص الدعم.

على الرغم من ذلك، هنالك بعض المحاولات الجيدة لحل هذه المشكلة مثل المكتبة JSBI.

تزودنا هذه المكتبة بالأعداد الكبيرة من خلال توابعها الخاصة. ويمكننا استخدامها بدلًا من الأعداد الكبيرة الأصيلة -بدون أي طريقة لترقيع لنقص الدعم-:

العملية في مكتبة JSBI العملية في الأعداد الكبيرة الأصيلة العملية
a = JSBI.BigInt(789) a = BigInt(789) إنشاء عدد كبير من عدد عادي
c = JSBI.add(a, b) c = a + b الجمع
c = JSBI.subtract(a, b) c = a - b الطرح
... ... ...

… ثم نستخدم لترقيع الدعم ملحقات إضافية (مثل الملحق الإضافي Babel) وذلك لتحويل استدعاءات المكتبة JSBI إلى الأعداد الكبيرة الأصيلة للمتصفحات التي تدعمها.

بتعبير آخر، يقترح هذا النهج أن نكتب الشيفرة في JSBI بدلًا من الأعداد الكبيرة الأصيلة. وتتعامل مكتبة JSBI مع الأعداد العادية والأعداد الكبيرة داخليًا، إذ تحاكي طريقة الاستخدام الصحيحة باتباع المواصفات عن كثب، لذلك ستكون الشيفرة جاهزة للتعامل مع الأعداد الكبيرة.

يمكننا استخدام شيفرة البرمجية للمكتبة JSBI على حالها للمحركات التي لا تدعم الأعداد الكبيرة والّتي تدعمها على حدٍ سواء - إذ ستُرقع نقص الدعم بتحويل الاستدعاءات إلى الأعداد الكبيرة الأصيلة.

المصادر

ترجمة -وبتصرف- للفصل BigInt من كتاب The JavaScript language


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...