٢٥ مارس ٢٠٢١

BigInt

إضافة حديثة
هذه إضافة حديثة إلى اللغه. يمكنك العثور على الحالة الحالية للدعم في https://caniuse.com/#feat=bigint.

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 الأصلية .

المراجع

خريطة الدورة التعليمية