تُستخدم أنواع البيانات Data Types لتصنيف نوعٍ معين من البيانات في اللغات البرمجية؛ على سبيل المثال، يمثل الرقم من جهة ومجموعة أحرف (string of characters) من جهة أخرى أنواعًا مختلفة من البيانات حيث سيتم التعامل معها بطريقة مختلفة في لغة جافا سكريبت.
وهذا أمرٌ مهم، لأن نوع البيانات الذي سوف تستخدمه سيحدد القيم التي يمكنك تعيينها لها وما العمليات التي يمكنك إجراؤها. وهذا يعني أنه حتى تتمكن من القيام بعمليات ذات متغيرات في لغة جافا سكريبت، من المهم فهم نوع البيانات لأي متغير معين.
في هذه المقالة، سنتناول كيفية عمل أنواع البيانات في لغة جافا سكريبت بالإضافة إلى أنواع البيانات المهمة الأصلية للغة؛ بالطبع لن نتطرق لجميع أنواع البيانات في هذه اللغة، حيث أنها كثيرة ومتنوعة، ولكننا سنقوم بشرح أكثرها أهميةً واستخدامًا، الأمر الذي سيساعدك على التعرف على الخيارات المتاحة لك في هذه اللغة.
التعريف الديناميكي للبيانات dynamic typing
تحتوي لغة JavaScript خاصية التعريف الديناميكي للبيانات dynamic data types، بمعنى أنه لا داعي لتعريف نوع البيانات أثناء كتابة الأوامر البرمجية، وإنما يتم التحقق من نوع البيانات المدخلة في وقت التشغيل runtime بدلًا من وقت التحويل البرمجي compile time. تُكتَب أيضًا أنواع البيانات في لغة البايثون Python ديناميكيًا.
باستخدام اللغات المكتوبة ديناميكيًا، يمكن استخدام متغير يحمل الاسم نفسه لحفظ أنواع بيانات مختلفة.
على سبيل المثال، يمكن تعيين المتغير t، الذي عُرِّف كمتغير من خلال الكلمة المفتاحية let، وتعيين أنواع مختلفة من البيانات إليه، أو يمكن تعريفه وتركه فارغًا بدون تعيين.
let t = 16; // t is a number
let t = “Teresa”; // t is a string
let t = true; // t is a Boolean
let t; // t is undefined
يمكن تعيين كل متغير من المتغيرات أعلاه كأي نوع بيانات متوفر في جافا سكريبت؛ كما أنه لا يلزم تعريف نوع البيانات بشكل صريح قبل البدء في استخدامها.
حيث أنه في بعض اللغات البرمجية الأخرى مثل لغة c++ يجب تعريف وتحديد نوع أي متغير أو قيمة قبل البدء في استخدامه، فمثلًا إذا كان المتغير x عددًا صحيحًا يجب وضع الكلمة المفتاحية int ( اختصارًا لـ integer) قبله ولا يجوز تركه بدون تعيين.
الأعداد Numbers
تحتوي لغة JavaScript على نوع واحد فقط من الأعداد، وليس هناك تعيين منفصل للأعداد سواء كانت صحيحة بدون كسور أو أعداد عشرية. ولهذا السبب، يمكن كتابة الأعداد بلغة JavaScript مع أو بدون فواصل عشرية:
let num1 = 93;
let num2 = 93.00;
في كلا الحالتين أعلاه، يُعتبر نوع البيانات المدخلة عددًا دائمًا بغض النظر عما إذا كان الرقم صحيح أو يحتوي على فواصل عشرية.
يمكن استخدام الترميز الأسي العلمي في لغة جافا سكريبت لاختصار الأرقام الكبيرة أو الصغيرة جدًا، كما في الأمثلة التالية:
let num3 = 987e8; // 98700000000
let num4 = 987e-8; // 0.00000987
تُعتبر الأعداد في لغة جافا سكريبت دقيقة حتى 15 رقمًا. وهذا يعني أن الأعداد ستُقرَّب بعد الوصول إلى الرقم 16:
let num5 = 999999999999999; // remains as 999999999999999
let num6 = 9999999999999999; // rounded up to 10000000000000000
بالإضافة إلى تمثيل الأعداد، تحتوي الأعداد في لغة جافا سكريبت على ثلاث قيم رمزية متاحة:
- اللانهاية infinity: قيمة رقمية تمثل عددًا موجبًا يقترب من اللانهاية.
- سالب اللانهاية –Infinity: قيمة رقمية تمثل عددًا سالبًا يقترب من اللانهاية.
- NaN: قيمة رقمية تمثل عددًا غير محدد، وهي تمثل اختصارًا لجملة not a number.
سيتم الحصول على النتيجة Infinity أو -Infinity إذا قمت بحساب رقم خارج أكبر رقم ممكن متاح في لغة JavaScript. ستحصل على إحدى النتيجتين أيضًا للقيم التي لم تُحدّد، كما هو الحال عند القسمة على صفر:
let num7 = 5 / 0; // will return Infinity
let num8 = -5 / 0; // will return -Infinity
بالتعبير التقني، ستُعرض Infinity عندما يتجاوز العدد القيمة:
1.797693134862315E + 308
والذي يمثل الحد الأعلى في لغة JavaScript. وبالمثل، ستُعرض -Infinity عندما يتجاوز قيمة الحد الأدنى
-1.797693134862316E + 308
يمكن أيضًا استخدام عدد Infinity في التكرار loops:
بالنسبة للبيانات المدخلة والتي لا تُعتبر أعدادًا، سيُعرض الرمز NaN. إذا حاولت إجراء عملية حسابية على رقم وقيمة غير رقمية، فسيتم إرجاع NaN. هذه الحالة موضحة في المثال التالي:
let x = 20 / “Shark”; // x will be NaN
نظرًا لأنه لا يمكن تقسيم العدد 20 بواسطة السلسلة “Shark”، لأنه لا يمكن تقييم واعتبار الناتج عدد، فإن القيمة التي أُرجِعت للمتغير x هي NaN. لكن، إذا كانت القيمة الموجودة في السلسلة عددًا، فإنه بالإمكان تنفيذ العملية الحسابية في لغة JavaScript:
let y = 20 / “5”; // y will be 4
في المثال السابق، نظرًا لأن القيمة في السلسلة “5” تُعتبر قيمة رقمية في لغة جافا سكريبت، فإنه يتم التعامل معها على هذا الأساس ويصبح بالإمكان قسمة الرقمين. عند تعيين قيمة NaN كمتغير مستخدم في عملية حسابية معينة، ستكون النتيجة دائمًا قيمة NaN، حتى عندما يكون المعامل الآخر عددًا قانونيًا:
let a = NaN;
let b = 37;
let c = a + b; // c will be NaN
هنالك نوع واحد فقط من الأعداد في لغة JavaScript. عند استخدام الأعداد، ستُعتبر جميع الأعداد التي تدخلها – بغض النظر عن نوعها سواء صحيحة أو نسبية – نوعًا واحدًا؛ كما أنك غير مطالب بتعريف نوع البيانات التي تقوم بإدخالها نظرًا لأن البيانات تُعرّف في لغة JavaScript بشكل ديناميكي كما أوضحنا سابقًا.
السلاسل Strings
السلسلة String عبارة عن تتابع مكون من حرف واحد أو أكثر (أحرف، أرقام، رموز). السلاسل مفيدة حيث أنها تمثل نصيًا البيانات النصية.
في لغة JavaScript، تتواجد السلاسل داخل علامات اقتباس مفردة ‘ أو علامات اقتباس مزدوجة “، لذا لإنشاء سلسلة، ضع سلسلة من الأحرف في علامات اقتباس:
let singleQuotes = ‘This is a string in single quotes.’;
let singleQuotes = “This is a string in single quotes.”;
يمكنك اختيار استخدام علامات الاقتباس المفردة أو علامات الاقتباس المزدوجة، ولكن يجب أن تلتزم بنفس العلامة داخل البرنامج.
يوضح الكود البرمجي أدناه كيف يمكن طباعة العبارة “Hello!، World” على شاشة الحاسوب، حيث أن الحروف التي تشكل عبارة Hello! ، World الموجودة داخل التنبيه () تُعتبر سلسلة.
عندما نقوم بتنفيذ الكود البرمجي أعلاه، ستظهر نافذة منبثقة بالإخراج التالي:
Output
Hello, World!
كما هو الحال مع أنواع البيانات الأخرى، يمكننا تعريف متغير وتعيين السلسلة له:
let hw = “Hello, World!”;
وعرض السلسلة في التنبيه () عن طريق استدعاء المتغير:
هناك العديد من العمليات التي يمكننا القيام بها على السلاسل الموجودة في البرامج من أجل معالجتها لتحقيق النتائج التي نرغب بها. السلاسل مهمة لتوصيل المعلومات إلى المستخدم، وللمستخدم لإعادة توصيل هذه المعلومات وإدخالها إلى البرنامج.
القيم المنطقية Booleans
يمكن أن يكون نوع البيانات المنطقية Boolean data إحدى قيمتين، إما صحيحة أو خاطئة. تُستخدَم المنطقية لتمثيل القيم الحقيقة المرتبطة بالعمليات الحسابية التابعة للفرع المنطقي للرياضيات، حيث تُستخدم هذه القيم بكثرة في الخوارزميات في علوم الكمبيوتر كونها سهلة التمثيل إما 0 أو 1، وهي اللغة التي يفهمها الحاسوب.
كلما رأيت نوع البيانات Boolean ، سيبدأ بحرف B كبير لأنه يحمل اسم عالم الرياضيات George Boole.
تكون نتائج العديد من العمليات الحسابية إما قيم صحيحة أو خاطئة:
- أكثر من greater than:
- · 500> 100 صحيح
- · 1> 5 خاطئ
- أقل من less than:
- · 200 <400 صحيح
- · 4 <2 خاطئ
- مساوٍequal:
- · 5 = 5 صحيح
- · 500 = 400 خاطئ
كما هو الحال مع أنواع البيانات الأخرى، يمكننا تعريف متغير وتعيين قيمة منطقية له:
let myBool = 5 > 8; // false
بما أن الرقم 5 ليس أكبر من الرقم 8 ، فإن المتغير myBool سوف يأخذ قيمة خاطئة false.
أثناء قيامك بكتابة المزيد من البرامج في لغة JavaScript، ستصبح أكثر درايةً بكيفية عمل المتغيرات المنطقية، وكيف يمكن للوظائف والعمليات المختلفة التي تكون نتائجها صحيحة True أو خاطئة False أن تغير مسار البرنامج الخاص بك.
المصفوفات Arrays
تحتوي المصفوفة على قيم متعددة داخل متغير واحد؛ يعني هذا أنه يمكنك احتواء قائمة مكونة من قيم معينة ضمن مصفوفة.
يُسمّى كل عنصر أو قيمة داخل المصفوفة عنصرًا element. يمكنك الإشارة إلى عناصر المصفوفة باستخدام رقم خاص يُسمّى index number.
تمامًا كما عرفنا السلاسل سابقًا كأحرف بين علامات الاقتباس، تُعرَّف المصفوفات من خلال وجود قيم بين أقواس مربعة [ ].
مصفوفة من السلاسل، على سبيل المثال، تبدو كما يلي:
إذا قمنا باستدعاء المتغير fish، فسنحصل على المخرجات التالية:
["shark", "cuttlefish", "clownfish", "eel"]
تُعتبر المصفوفات مرنة للغاية mutable بحيث يمكن إضافة قيم عناصر لها وإزالتها وتغييرها؛ بعكس السلاسل حيث لا يمكن تعديل قيم نفس السلسلة ويجب تعريف سلسة جديدة بدلًا منها.
الكائنات Objects:
يمكن أن يحتوي نوع بيانات الكائن في لغة JavaScript على العديد من القيم كالثنائي التالي الاسم: القيمة name: value. توفر هذه الأزواج طريقة مفيدة لتخزين البيانات والوصول إليها.
يتكون بناء الكائن الحرفي من الزوج الثنائي الاسم: القيمة مفصولة بفواصل مع أقواس متعرجة على كلا الجانبين { }.
عادةً ما تُستخدم للاحتفاظ بالبيانات ذات الصلة، مثل المعلومات الموجودة في بطاقة التعريف ID، يبدو الكائن في لغة JavaScript حرفيًا كالتالي، مع مراعاة وجود المسافات بين الخصائص:
بدلًا من ذلك، وخاصةً بالنسبة للكائنات الحرفية التي تحتوي على عدد كبير من أزواج الاسم: القيمة، يمكننا كتابة هذا النوع من البيانات على شكل أسطر متعددة، بمسافة بيضاء بعد كل نقطتين:
يحتوي متغير الكائن sammy في كلٍّ من الأمثلة المذكورة أعلاه على 4 خصائص: firstName وlastName وcolor وlocation. هذه هي كل القيم التي تُمرَّر مفصولةً بـ ( , ).
العمل مع أنواع متعددة من البيانات
بينما سيحتوي كل برنامج تقوم بكتابته على أنواع متعددة من البيانات، من المهم أن تضع في عين الاعتبار أنك ستجري عملياتك بشكل عام ضمن نفس نوع البيانات، ويعني هذا أنك ستقوم بإجراء العمليات الحسابية على الأرقام فقط بينما يمكنك تجزئة السلاسل من ناحية أخرى.
عندما تستخدم عاملًا يعمل مع أنواعٍ مختلفة من البيانات، مثل عملية + التي تمكنك من إضافة الأرقام أو دمج concatenate عدة سلاسل مع بعض، فقد تحصل على نتائج غير متوقعة.
على سبيل المثال، عند استخدام عملية + مع الأرقام والسلاسل معًا، ستُعامل هذه الأرقام باعتبارها سلسلة (وبالتالي ستُدمج مع السلسلة)، لكن ترتيب أنواع البيانات سيؤثر على التسلسل وعملية الدمج.
لذلك، إذا قمت بإنشاء متغير يقوم بتنفيذ عملية الدمج، فسوف تقوم لغة JavaScript بتفسير كل عنصر أدناه كسلسلة:
let o = "Ocean" + 5 + 3;
إذا قمت باستدعاء o، فسوف تحصل على القيمة التالية:
Ocean53
لكن، إذا قمت بإضافة الرقمين أولًا عندما ينفذ الكود ويصل إلى السلسلة “Ocean”، فإن القيمة التي يتم إرجاعها هي مجموع الرقمين مضافة إلى السلسلة:
let p = 5 + 3 + "Ocean";
8Ocean
بسبب هذه النتائج غير المتوقعة، يفضل أن تقوم بمعالجة نوع بيانات واحد بدلًا من عدة أنواع في نفس الوقت. ومع ذلك ،فإن لغة JavaScript لا تقوم بإرجاع أخطاء errors عند مزج أنواع مختلفة من البيانات، كما تفعل بعض لغات البرمجة الأخرى.
الخلاصة:
في هذه المرحلة ، يجب أن يكون لديك فهم أفضل لبعض أنواع البيانات الرئيسية المتاحة لك لاستخدامها في لغة JavaScript.
سيصبح كل نوع من أنواع البيانات مهمًا أثناء تطوير مشاريعك البرمجية بلغة JavaScript.
- ترجمة: ياسر طبيله.
- مراجعة: ياسين بجدو.
- تدقيق لغوي: رأفت فياض.
كيف يمكن عمل const numbers =[2,6,9000,2839,897] في function تقسيم الرقم 2 وجعل النتيجة ارقام صحيحة
شكرا ليكو