نريد أن نتيح هذا المشروع المفتوح المصدر إلى كل الناس حول العالم. من فضلك ساعدنا على ترجمة محتوى هذه السلسله للغة التى تعرفها.
إضافة حديثة
هذه إضافة حديثة إلى اللغه. يمكنك العثور على الحالة الحالية للدعم في 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 الأصلية .

المراجع

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