يمكن أن يحتوي المتغير على أي نوع من أنواع البيانات في JavaScript. أي من الممكن أن يكون متغير من نوع سلسلة نصية في وقت ما، ثم يتغير محتواه إلى قيمة عددية وهكذا دواليك.
// لا يوجد أي خطأ let message = "hello"; message = 123456;
تسمى اللغات البرمجية التي تسمح بتغيير نوع القيم المسندة إلى المتغير بلغات برمجة «ديناميكية النوع» (dynamically typed)، ومعنى ذلك أنه توجد أنواع للبيانات ولكن لا يتم ربط المتغير بنوع معين منها.
هنالك سبعة أنواع أساسية في لغة JavaScript. سنذكرها الآن بشكل عام، وسنتحدث في الفصول القادمة عن كل نوع منها بالتفصيل.
الأعداد
let n=123; n=12.345;
يمكن تمثيل الأعداد، بما فيها الأعداد الصحيحة (integers) والعشرية (floating point)، في JavaScript عبر النوع number
.
هنالك العديد من العمليات التي يمكن تنفيذها على المتغيرات العددية، مثل، الضرب *
، والقسمة /
، والجمع +
، والطرح -
، وغيرها من العمليات الرياضية.
كما أن هناك «قيم عددية خاصة»، بالإضافة إلى الأعداد العادية، والتي تنتمي أيضًا إلى هذا النوع من البيانات مثل: Infinity
، و -Infinity
، و NaN
. وهاك شرحها:
-
Infinity
: وتمثل قيمة اللانهاية الرياضية، وهي قيمة خاصة أكبر من أي عدد موجب آخر. ومن الممكن أن نحصل عليها في عدة حالات منها قسمة عدد على الصفر:
alert (1/0); // Infinity
أو بالإمكان الإشارة إليها بشكل مباشر:
alert (Infinity); // Infinity
-
NaN
: هذه القيمة ناتجة عن اختصارالعبارة "Not a Number" (ليس عددًا) وتمثل خطأً حسابيًّا، أو حالة عدم تعيين. وهي نتيجة عملية رياضية خاطئة أو غير معروفة. إليك المثال التالي:
alert( "not a number"/2 ); // NaN, لا يمكن إجراء مثل عملية القسمة هذه
وتتصف القيمة NaN
بأنها «لاصقة» (sticky)، أي بمعنى عندما ُتنفَّذ أي عملية على NaN
، فالقيمة الناتجة هي NaN
أيضًا.
alert ("not a number" / 2+5); // NaN
لذلك عند وجود القيمة NaN
في أي مكان من التعابير الرياضية، فستطغى على كامل النتيحة.
وتنتمي القيم العددية الخاصة شكليًا فقط إلى نوع القيم العددية، لأنها في واقع الأمر لا تعبر عن أعداد بمفهومها الشائع. سنتكلم لاحقًا عن التعامل مع الأعداد في فصل (الأعداد).
العمليات الرياضية «آمنة»
ممارسة الرياضيات آمنة في JavaScript، وبإمكانك القيام بأي عملية حسابية، مثل: القسمة على صفر، والتعامل مع السلاسل الغير عددية كأعداد، وغيرها من العمليات. ثق تمامًا أن السكربت لن ينتهي بخطأ فادح (أو يتوقف عن العمل). أسوأ ما في الأمر أنك ستحصل على النتيجة NaN
.
السلاسل النصية (النصوص)
تمثَّل النصوص (سنطلق عليها «سلاسل نصية» من الآن وصاعدًا) عبر النوع string
. يجب أن تُحاط السلسلة النصية في JavaScript بإشارتي تنصيص.
let str = "Hello"; let str2 = 'Single quotes are ok too'; let phrase = `can embed ${str}`;
يوجد في لغة JavaScript ثلاثة أنواع من إشارات التنصيص وهي:
- المزدوجة: مثل "Hello".
- المفردة: مثل 'Hello'.
- المائلة: مثل Hello (إضافة الإشارة).
إشارتي التنصيص المفرد والمزدوج هما عبارة عن إشارات تنصيص تتصف بأنها «بسيطة» ولا يوجد أي فرق بينها في JavaScript.
أما إشارة التنصيص المائلة، فهي عبارة عن إشارات تنصيص لها «وظيفة إضافية»، إذ تسمح لك بإضافة متغيرات وتعابير إلى السلسلة النصية بعد إحاطتها بـ ${...}
. فمثلًا:
let name = "أحمد"; // تضمين متغير alert (`مرحبًا، ${name}!`); // مرحبًا، أحمد! // تضمين تعبير alert (`the result is ${1+2}`); // النتيجة هي 3
يُحسب التعبير داخل ${...}
وتصبح نتيجته جزءًا من السلسلة النصية. بإمكاننا وضع أي شيء هناك مثل: المتغير name
أو التعبير الرياضي 1 + 2
أو حتى تعابير برمجية أخرى أكثر تعقيدًا.
ولكن أبقِ في ذهنك أن هذا مقتصر فقط على إشارات التنصيص المائلة. ولا تستطيع إشارات التنصيص الأخرى القيام بمثل هذا العمل!
alert (" the result is ${1+2}" ); // ${1+2} النتيجة هي // فلا تفعل إشارات التنصيص المزدوجة أي شيء
إذا كنت تشعر بصعوبة الأمر، لا تقلق. سنتحدث عنه لاحقًا بشكل موسع في فصل السلاسل النصية.
المحارف ليس لها نوع مخصص للأسف
يوجد في بعض اللغات البرمجية نوعًا خاصًّا من البيانات للمحرف المفرد (character) ويسمى char
في لغة C و Java مثلًا.
لا يوجد مثل هذا النوع في JavaScript. ويوجد فقط نوع واحد وهو string
(سلسلة نصية) الذي من الممكن أن يحتوي على محرف واحد أو أكثر.
النوع المنطقي (البولياني)
يأخذ النوع boolean
إحدى القيمتين: true
(صح) أو false
(خطأ) وتدعى هاتان القيمتان بالقيم المنطقية.
من الشائع استخدام هذا النوع لحفظ البيانات التي لها القيم (نعم / لا): true
تعني "نعم، صحيح"، و false
تعني "لا، خطأ". إليك المثال التالي:
let nameFieldChecked = true; // name نعم، جرى تحديد الحقل let ageFieldChecked = false; // غير محدَّد age لا، الحقل
أضف إلى ذلك أن القيم المنطقية تعبِّر عن ناتج عمليات الموازنة:
let isGraeter = 4>1; alert(isGreater); // true إذ نتيجة الموازنة محقَّقة أي
القيمة الخالية: null
لا تنتمي القيمة الخالية null
إلى أي نوع من أنواع البيانات المذكورة سابقًا ولكن لها نوع خاص. يملك هذا النوع الخاص قيمة واحدة هي null
:
let age = null;
في لغة JavaScript، لا يعبِّر النوع null
عن مرجع لكائن غير موجود أو مؤشر خالي كما في لغات برمجية أخرى. ولكنه عبارة عن قيمة خاصة تمثِّل "لا شيء"، أو "فارغ"، أو "قيمة غير معلومة". فمثلًا، الشيفرة البرمجية السابقة تعدُّ المتغير age
غير معلوم أو فارغ لسبب ما.
القيمة الغير معرفة: undefined
يمكن تمييز نوع آخر أيضًا للبيانات وهو «غير مُعرَّف» الذي يمثله النوع undefined
. ويشكل هذا النوع نوعًا خاصًّا قائمًا بنفسه تمامًا مثل النوع null
. أما معنى «غير معرّف» أي أنه لم تُسنَد أية قيمة للمتغير بعد:
let x; alert (x); // "undefined" تُعرَض القيمة
تقنيًا، من الممكن إسناد القيمة undefined
لأي متغير:
let x=123; x = undefined; alert(x); // "undefined"
ولكن لا أنصحك بالقيام بذلك. نستخدم عادةً القيمة null
لإسناد القيمة الخالية أو غير المعروفة لمتغير، ونستخدم undefined
للتحقق من أن إذا كان للمتغير قيمة أو لا.
الكائنات والرموز
النوع object
(كائن) هو نوعٌ خاصٌّ. تسمى جميع الأنواع السابقة بالأنواع «الأساسية» (primitive) لأن قيمها تحتوي على شيء واحد فقط (سلسلة نصية أو عدد أو أي شيء آخر). ولكن تُستخدَم الكائنات لتخزين مجموعة من البيانات والكيانات (entity) الأكثر تعقيدًا. سنتعامل معها في فصل الكائنات بعد الانتهاء من دراسة الأنواع الأساسية.
يستخدم النوع symbol
(رمز) لتشكيل معرّف (identifier) مُميَّز للكائنات. يُفضَّل دراسة هذا النوع بعد الانتهاء من الكائنات ولكن ذكره هنا ضروري لاستكمال جميع أنواع البيانات.
المعامل typeof
يُحدِّد المعامل typeof
نوع الشيء المُمرَّر إليه. ويكون مفيدًا عندما تحتاج إلى معالجة القيم بطرق مختلفة حسب نوعها، أو فقط القيام بفحص سريع لنوع البيانات. ويمكن كتابة الصياغة بطريقتين:
-
معامل:
typeof x
. -
تابع:
typeof(x)
.
بمعنى آخر، من الممكن استخدامه مع أو بدون الأقواس، وتكون النتيجة واحدة. نتيجة استدعاء typeof x
هو سلسلة نصية تمثل اسم النوع:
typeof undefined // "undefined" typeof 0 // "number" typeof true // "boolean" typeof "foo" // "string" typeof Symbol("id") // "symbol" typeof Math // "object" (1) typeof null // "object" (2) typeof alert // "function" (3)
قد تحتاج لتوضيح نتائج الأسطر الثلاث الأخيرة:
-
Math
هو كائن مضمّن في JavaScript ويوفر العمليات الرياضية. سنتحدث عنه لاحقًا في فصل الأعداد، وذكرناه هنا فقط كمثال عن نوع الكائن. -
نتيجة
typeof null
هي "object" أي كائن. أليس هذا خطأ؟! بالتأكيد. وقد تم الاعتراف بذلك رسميًا، ولكن بقيت هذه النتيجة من أجل المحافظة على التوافقية. القيمة "null" ليست كائنًا بل هي قيمة لنوع منفصل بحد ذاته. لذلك، مرةً أخرى، نؤكد أنّ هذا خطأ من اللغة نفسها. -
نتيجة
typeof alert
هي "function" (دالة)، لأنalert
هو دالة في لغة JavaScript. سنتحدث لاحقًا عن التوابع في الفصول القادمة وستلاحظ أنه لا يوجد نوع خاص اسمه "function" في لغة JavaScript. تنتمي التوابع إلى نوع الكائنات ولكن لها معاملة خاصة فيtypeof
. شكليًا، هذا خطأ، ولكنه مفيد جدًا عند التطبيق العملي.
الخلاصة
هناك سبعة أنواع أساسية من أنواع البيانات في JavaScript هي:
-
number
: يمثِّل الأعداد بكل أنوعها: الصحيحة والعشرية. -
string
: يمثِّل السلاسل النصية. ويمكن أن تحتوي السلسلة النصية على محرف واحد أو أكثر، ولكن لا يوجد نوع خاص من أجل المحرف الواحد. -
boolean
: يمثِّل القيم المنطقية (صح / خطأ). -
null
: يمثِّل القيم الخاوية. وهو نوع خاص يملك قيمة وحيدة وهي القيمةnull
. -
undefined
: قيمة غير معرَّفة تكون قيمةً للمتغيرات التي لم تسند قيمة محدَّدة لها بعد. وهو نوع خاص يملك قيمة وحيدة وهيundefined
. -
object
: كائن من أجل بنى البيانات الأكثر تعقيدًا. -
symbol
: رمز للمعرفات الخاصة.
ويسمح المعامل typeof
بمعرفة أنوع القيم المخزنة في المتغيرات:
-
له شكلين:
typeof x
أوtypeof(x)
. - يعيد سلسلة نصية تحوي اسم النوع، مثل "string".
-
من أجل
null
يعطي القيمة "object" وهذا خطأ في اللغة، فالقيمة الخالية ليست من نوع الكائن.
سنركز في الفصل القادم على القيم الأساسية ثم ننتقل إلى الحديث عن الكائنات.
تمارين
1. إشارات تنصيص السلاسل النصية
الأهمية: 5
ما هو خرج هذا السكربت؟
let name " Ilya"; alert (`hello ${1}`); //? alert (`hello ${"name"}`); //? alert (`hello ${name}`); //?
الحل
تُضمن الفاصلة العليا الخلفية التعابير الموجودة داخل ${…}
في السلسلة النصية:
let name " Ilya"; // قيمة التعبير هو 1 alert (`hello ${1}`); // hello1 // "name" قيمة التعبير هي السلسلة النصية alert (`hello ${"name"}`); // hello name // name قيمة التعبير هو ما ضُمِّن بالمتغير alert (`hello ${name}`); // hello Ilya
ترجمة -وبتصرف- للفصل Data types من كتاب The JavaScript Language
انظر أيضًا
- المقال التالي: التحويل بين الأنواع
- المقال السابق: المتغيرات
- كامل مقالات دليل تعلم جافاسكربت
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.