أنواع البيانات والقيم الخاصة بها | JavaScript

أنواع البيانات (Data Types)

في عالم البرمجة، لا يتعامل الكمبيوتر مع "البيانات" ككتلة واحدة مبهمة. بالنسبة له، الرقم 5 يختلف تماماً عن الحرف "5"، ويختلف كلياً عن القيمة true. لكي تتقن JavaScript، يجب أن تفهم كيف تصنف اللغة هذه البيانات في "أنواع" (Types).

تتميز JavaScript بأنها لغة "ديناميكية النوع" (Dynamically Typed). ماذا يعني هذا؟ يعني أنك لست مضطراً لإخبار الكمبيوتر بنوع البيانات عند إنشاء المتغير (كما في لغات مثل Java أو C++). المتغير في JavaScript مرن جداً؛ يمكن أن يحمل نصاً الآن، وفي السطر التالي يحمل رقماً دون أي مشاكل. في هذا الدرس، سنفصّل أهم الأنواع الأساسية (Primitive Types) التي ستستخدمها في 99% من وقتك.

النصوص (Strings): التعامل مع الكلمات

الـ String هو أي سلسلة من الحروف، الأرقام، أو الرموز التي يتم التعامل معها كـ "نص" وليس كقيمة حسابية. لكي يفهم المتصفح أنك تكتب نصاً، يجب أن تحيط الكلام بعلامات تنصيص (Quotes).

أنواع علامات التنصيص (Quotes)

في JavaScript، لديك ثلاث طرق لكتابة النصوص، ولكل منها استخدام:

  • علامات التنصيص المزدوجة (Double Quotes) " ": هي الطريقة التقليدية والأكثر شيوعاً.
  • علامات التنصيص المفردة (Single Quotes) ' ': تؤدي نفس وظيفة المزدوجة تماماً. الفرق الوحيد هو في التفضيل الشخصي أو إذا كان النص نفسه يحتوي على علامات تنصيص (مثلاً: "He's happy" نستخدم المزدوجة في الخارج لتحتوي المفردة في الداخل).
  • الشرطة المائلة العكسية (Backticks) ` `: هذه هي "الساحرة" الحديثة (ظهرت في ES6). تسمح لك بكتابة نصوص متعددة الأسطر، والأهم من ذلك، تسمح بدمج المتغيرات داخل النص بسهولة فائقة.

دمج النصوص (Concatenation)

في الماضي، كنا نستخدم علامة الزائد + للصق النصوص ببعضها. مثلاً: "Hello " + name. هذه الطريقة ما زالت تعمل، لكنها تصبح معقدة ومزعجة عند وجود مسافات كثيرة ومتغيرات متعددة (تسمى "Spaghetti Code").
الحل الحديث هو استخدام Template Literals (التي تستخدم الـ Backticks). ببساطة، تضع المتغير داخل ${ } في وسط النص، وسيقوم المتصفح باستبداله بقيمته تلقائياً.

مثال: طرق كتابة ودمج النصوص

// 1. الطرق التقليدية
let name1 = "أحمد"; // Double Quotes
let name2 = 'منى';  // Single Quotes

// مشكلة الاقتباسات داخل النص
// let text = 'I'm happy'; // هذا خطأ! سيفهم المتصفح أن النص انتهى عند 'm
let correctText = "I'm happy"; // حل: استخدام المزدوجة في الخارج

// 2. الدمج القديم (متعب)
let job = "مهندس";
let messageOld = "مرحباً، اسمي " + name1 + " وأنا أعمل " + job;
console.log(messageOld);

// 3. الدمج الحديث (Template Literals) - الاحترافي
// لاحظ استخدام ` ` (حرف الذال في الكيبورد)
let messageNew = `مرحباً، اسمي ${name1} وأنا أعمل ${job}`;
console.log(messageNew);

اختر - أي من الجمل البرمجية التالية تستخدم ميزة Template Literals لدمج متغير يسمى age داخل نص؟
(أ) "My age is " + age. (ب) `My age is ${age}`. (ج) 'My age is {age}'. (د) "My age is ${age}".

الإجابة: (ب) `My age is ${age}`. (يجب استخدام الـ Backticks `` والقوسين المعقوفين المسبوقين بعلامة الدولار).

الأرقام (Numbers): الحسابات والقيم الخاصة

على عكس لغات البرمجة الأخرى التي تعقد الأمور وتفرق بين "الأرقام الصحيحة" (Integers) و"الكسور" (Floats)، فإن JavaScript بسيطة جداً: كل الأرقام هي من نوع واحد فقط وهو Number. سواء كان الرقم 5، أو 5.5، أو حتى 5000.00، كلها تعامل معاملة واحدة.

القيم الرقمية الخاصة (Special Numbers)

هناك قيم تابعة لنوع الـ Number ولكنها ليست أرقاماً بالمعنى التقليدي، وتظهر عادة عند حدوث أخطاء حسابية:

  • Infinity (اللانهائية): تظهر عندما تقسم رقماً موجباً على صفر، أو عندما يكون الرقم ضخماً جداً لدرجة لا تستوعبها الذاكرة.
  • NaN (Not a Number): وتعني "ليس رقماً". تظهر هذه القيمة الكارثية عندما تحاول القيام بعملية حسابية "غير منطقية"، مثل ضرب كلمة "تفاحة" في الرقم 5. النتيجة ليست رقماً، لذا يخبرك JavaScript بأنها NaN. ومن المثير للسخرية أن نوع NaN يعتبر "Number" تقنياً!
مثال: الأرقام والعمليات الحسابية

let age = 25;         // رقم صحيح
let price = 99.99;    // رقم عشري (كسر)
let heavy = 1000000;  // يمكن كتابتها 1e6

// العمليات الحسابية
console.log(age + 5); // جمع: 30
console.log(age * 2); // ضرب: 50

// القيم الخاصة (Special Values)
let x = 10 / 0; 
console.log(x); // النتيجة: Infinity

let y = "Ahmed" * 5;
console.log(y); // النتيجة: NaN (عملية مستحيلة منطقياً)

// معلومة خطيرة: NaN "معدية"
// أي عملية حسابية يدخل فيها NaN تكون نتيجتها NaN
console.log(y + 500); // النتيجة: NaN

اختر - ماذا ستكون نتيجة الكود التالي: console.log("Hello" - 5); ؟
(أ) "Hello-5". (ب) Error (توقف البرنامج). (ج) 0. (د) NaN.

الإجابة: (د) NaN. (لأن علامة الطرح "-" تعمل فقط مع الأرقام، ومحاولة طرح رقم من نص غير منطقية، فيعطي "Not a Number").

القيم المنطقية (Booleans): نعم أو لا

سمي هذا النوع تيمناً بعالم الرياضيات "جورج بول". هذا النوع هو الأبسط على الإطلاق، فهو لا يقبل إلا قيمتين فقط لا ثالث لهما: true (صح) أو false (خطأ).

أين نستخدم الـ Boolean؟

نادراً ما تقوم بإنشاء متغير وتضع قيمته true بيدك مباشرة (إلا في حالات التفعيل/التعطيل Flags). ولكن الـ Booleans هي نتيجة طبيعية لعمليات "المقارنة". عندما تسأل الكمبيوتر: "هل 10 أكبر من 5؟"، الكمبيوتر لا يجيب بـ "نعم"، بل يجيب بـ true.

هذا النوع هو العمود الفقري للجمل الشرطية (if statements). لا يمكن اتخاذ أي قرار برمجي (مثل: إذا كان المستخدم مسجلاً للدخول، اظهر له الصفحة) بدون الـ Boolean.

مثال: القيم المنطقية والمقارنات

// تفعيل ميزة معينة
let isDarkMode = true; 
let isLoading = false;

// المقارنات تنتج Booleans
let a = 5;
let b = 10;

console.log(a > b);  // هل 5 أكبر من 10؟ النتيجة: false
console.log(a == 5); // هل a تساوي 5؟ النتيجة: true

if (isDarkMode) {
    console.log("تطبيق الوضع الليلي...");
}

اختر - ما هو نوع البيانات الناتج عن العملية التالية: 100 < 50 ؟
(أ) Number. (ب) String. (ج) Boolean. (د) Undefined.

الإجابة: (ج) Boolean. (لأن عمليات المقارنة نتيجتها دائماً إما true أو false).

الأنواع الفارغة (Undefined vs Null): الفرق المحير

هذا القسم هو أكثر ما يربك المبتدئين والمحترفين على حد سواء. JavaScript لديها طريقتان لقول "لا يوجد شيء هنا"، ولكن هناك فرق فلسفي وتقني دقيق بينهما.

1. غير المعرف (Undefined)

تعني أن المتغير "موجود، ولكن لم يتم إعطاؤه قيمة بعد". هي القيمة الافتراضية لأي متغير تنشئه وتتركه فارغاً. كأنك اشتريت صندوقاً ووضعت عليه ملصقاً، لكنك لم تضع بداخله أي شيء ولم تغلقه بعد. JavaScript هي من تضع هذه القيمة تلقائياً.

2. الفارغ (Null)

تعني أن المتغير "فارغ عمداً". هذه القيمة لا يضعها JavaScript تلقائياً، بل يضعها المبرمج بنفسه ليقول: "أنا أعلم أن هذا المتغير موجود، وأريده أن يكون فارغاً الآن ولا يحمل أي قيمة قديمة". كأنك أحضرت الصندوق، وفتحت محتوياته، وتأكدت أنه فارغ تماماً.

تشبيه بسيط للحفظ

  • Undefined: نسيت أن تضع شيئاً في الصندوق.
  • Null: وضعت "اللاشيء" في الصندوق بنفسك.
مثال: الفرق بين null و undefined

// Undefined: الحالة الافتراضية
let user; 
console.log(user); // النتيجة: undefined (لأننا لم نحدد قيمة)

// Null: تفريغ متعمد
let selectedProduct = "iPhone 15";
// قرر المستخدم إلغاء الاختيار
selectedProduct = null; 
console.log(selectedProduct); // النتيجة: null

// هل هما متساويان؟
// نعم في القيمة (كلاهما فراغ)
console.log(null == undefined); // true
// لا في النوع (كل واحد نوع مختلف)
console.log(null === undefined); // false

اختر - قمت بتعريف متغير let score; ولم تسند له أي قيمة. ما هي قيمته الافتراضية التي سيطبعها المتصفح؟
(أ) 0. (ب) null. (ج) undefined. (د) error.

الإجابة: (ج) undefined. (لأن المتصفح يعطي هذه القيمة تلقائياً للمتغيرات التي لم تُهيأ).

معرفة نوع البيانات (typeof Operator)

بما أن JavaScript لا تجبرك على تحديد النوع، أحياناً قد تنسى نوع البيانات الموجود داخل متغير معين، أو قد تأتيك بيانات من السيرفر ولا تعرف هل هي رقم أم نص. هنا يأتي دور الأداة السحرية typeof.

كيفية الاستخدام

تكتب كلمة typeof متبوعة بمسافة ثم اسم المتغير أو القيمة. وسترجع لك نصاً (String) يخبرك بالنوع (مثلاً "string", "number", "boolean").

ملاحظة غريبة (Bug): في JavaScript، إذا كتبت typeof null ستكون النتيجة "object". هذا خطأ برمجي قديم جداً في اللغة لم يتم إصلاحه لعدم كسر المواقع القديمة، لكن يجب أن تعرف أن null ليس كائناً (Object) بل هو نوع مستقل.

مثال: استخدام typeof

console.log(typeof "مرحباً"); // "string"
console.log(typeof 100);      // "number"
console.log(typeof true);     // "boolean"
console.log(typeof undefined);// "undefined"

let salary = 5000;
console.log(typeof salary);   // "number"

salary = "خمسة آلاف";
console.log(typeof salary);   // "string" (تغير النوع ديناميكياً)

// الخطأ الشهير
console.log(typeof null);     // "object" (تذكر هذا الاستثناء)

اختر - ما هي النتيجة التي ستظهر في الـ Console عند كتابة typeof "500"؟
(أ) "number". (ب) "string". (ج) "text". (د) "integer".

الإجابة: (ب) "string". (لأن الرقم محاط بعلامات تنصيص، مما يجعله نصاً في نظر JavaScript).