مقدمة: لماذا هذا مهم؟
تخيل موقفًا: أنت تكتب آلة حاسبة للإكراميات (البقشيش) بلغة JavaScript. المستخدم يدخل مبلغ الفاتورة في حقل الإدخال، ويضغط على الزر — ويحصل على... undefined أو ما هو أسوأ، سلسلة نصية "10010" بدلاً من الرقم 110. هل هذا مألوف؟ إذا كنت قد بدأت للتو رحلتك في البرمجة، فإن مشكلة تحويل سلسلة نصية إلى رقم في JavaScript هي واحدة من تلك "الأخطاء الشائعة" التي يقع فيها الجميع تمامًا.
على موقع Stack Overflow، جمع سؤال "How can I convert a string to an integer in JavaScript?" آلاف المشاهدات ومئات الإجابات. هذا يعني أنه حتى المطورين ذوي الخبرة يخلطون أحيانًا في التفاصيل الدقيقة. اليوم سنفهم مرة واحدة وإلى الأبد كيفية تحويل سلسلة نصية إلى رقم في JavaScript بشكل صحيح، وما هي الطرق التي تعمل وأيها لا تعمل، ولماذا تكون النتيجة أحيانًا غير متوقعة.
هل أنت مستعد؟ إذن لنبدأ!
لماذا نحتاج إلى تحويل سلسلة نصية إلى رقم؟
JavaScript هي لغة ذات كتابة ديناميكية. هذا رائع لأنه يمكنك عدم التفكير في أنواع البيانات... حتى تواجه خطأ (bug). المشكلة هي أن البيانات من prompt()، وحقول الإدخال input في النماذج، ومعلمات URL، أو API تأتي دائمًا على شكل سلاسل نصية. حتى لو أدخل المستخدم "42"، فإن JavaScript لا ترى رقمًا، بل مجموعة من الرموز.
جرب جمع سلسلتين نصيتين:
let a = "10";let b = "20";console.log(a + b); // "1020"أرأيت؟ بدلاً من المجموع 30 حصلت على دمج (concatenation). لتجنب ذلك، تحتاج إلى إخبار JavaScript بوضوح: "يا إلهي، هذه أرقام، تعامل معها كأرقام!".
الطريقة رقم 1: parseInt() — الكلاسيكية
الطريقة الأكثر شيوعًا لتحويل سلسلة نصية إلى عدد صحيح في JavaScript هي الدالة parseInt(). تأخذ سلسلة نصية و"تستخرج" منها عددًا صحيحًا، متجاهلة كل ما يأتي بعد الأرقام.
الصيغة والأمثلة
let str = "42";let num = parseInt(str);console.log(num); // 42 (رقم)
// تعمل حتى مع "القمامة" بعد الأرقامconsole.log(parseInt("123px")); // 123console.log(parseInt("10.99")); // 10 (تتجاهل الجزء العشري)
// لكن إذا كانت السلسلة لا تبدأ برقم...console.log(parseInt("abc123")); // NaNconsole.log(parseInt(" 7")); // 7 (يتم تجاهل المسافات في البداية)مهم: parseInt() تتوقف عند أول رمز غير رقمي. إذا كانت السلسلة تبدأ بحرف — ستحصل على NaN (ليس رقمًا).
الوسيط الثاني — نظام الأرقام
قليلون يعرفون، لكن parseInt() لها معامل ثانٍ — radix (أساس نظام الأرقام). هذا ينقذ من الأخطاء المتعلقة بالأرقام الثمانية:
// بدون radix قد يكون هناك التباسconsole.log(parseInt("010")); // 10 (في الإصدارات القديمة من IE قد يكون 8)
// حدد دائمًا 10 للنظام العشريconsole.log(parseInt("010", 10)); // 10console.log(parseInt("FF", 16)); // 255 (نظام سداسي عشري)نصيحة من المحترفين: قم دائمًا بتمرير الوسيط الثاني 10 إذا كنت تعمل مع الأرقام العشرية. هذا يجعل الكود أكثر وضوحًا وأمانًا.
الطريقة رقم 2: Number() — صارمة ولكن صادقة
الدالة Number() هي طريقة أكثر صرامة لتحويل سلسلة نصية إلى رقم في JavaScript. على عكس parseInt()، فهي لا تتسامح مع أي رموز غريبة.
console.log(Number("42")); // 42console.log(Number("10.99")); // 10.99 (تحتفظ بالجزء العشري)console.log(Number("123px")); // NaN (السلسلة تحتوي على رموز إضافية)console.log(Number("")); // 0 (سلسلة فارغة = 0)console.log(Number(" ")); // 0متى تستخدم: إذا كنت متأكدًا بنسبة 100% أن السلسلة تحتوي على رقم فقط (على سبيل المثال، بعد التحقق من صحة النموذج). بالنسبة لإدخال المستخدم، يُفضل استخدام parseInt() أو