٢٥ مارس ٢٠٢١

أنماط البيانات

القيمة في جافا سكربت دائما تكون من نوع معين . على سبيل المثال نص أو رقم.

توجد 8 أنواع بيانات أساسية في جافا سكريبت . هنا سوف نغطيهم بشكل عام وفي الفصول القادمة سنتكلم عن كل نوع بالتفصيل.

نستطيع أن نضع أي نوع في متغير . على سبيل المثال المتغير قد يكون في لحظة ما نص ثم يتم تخزين رقم فيه:

// لا يوجد خطأ
let message = "hello";
message = 123456;

لغات البرمجة التي تسمح بذلك مثل جافا سكريبت يطلق عليها “dynamically typed” يعني أنه يوجد أنواع بيانات محددة لكن المتغيرات غير مقيدة بهم .

الرقم

let n = 123;
n = 12.345;

النوع رقم يمثل الأرقام الصحيحة والعشرية.

توجد عمليات كثيرة تتم على الأرقام مثل الضرب *والقسمة / والإضافة + و الطرح -وهكذا.

بجانب الأرقام الطبيعية هناك ما يسمى “قيم رقمية خاصة” التي أيضاً تنضم لهذا النوع من البيانات: Infinityو -Infinity و NaN.

  • Infinity تمثل التعبير الرياضي مالانهاية ∞. وهي قيمة خاصة أكبر من أي رقم.

    نستطيع أن نحصل عليها نتيجة القسمة على صفر:

    alert( 1 / 0 ); // مالا نهاية

    أو يتم الرجوع إليها مباشرة:

    alert( Infinity ); // مالانهاية
  • NaN تعبر عن خطأ حسابي. نتيجة عملية حسابية خاطئة أو غير معروفة على سبيل المثال:

    alert( "not a number" / 2 ); // NaN مثل هذه القسمة خاطئة

    NaN لزجة. أي عملية تتم على NaN ترجع NaN:

    alert( "not a number" / 2 + 5 ); // NaN

    لذلك إذا وجدت NaN في أي مكان في تعبير حسابي تنتشر في النتيجة بأكملها.

العمليات الرياضية أمنة

القيام بالرياضيات “أمن” في جافا سكربت. نستطيع القيام بأي شئ: القسمة على صفر و معاملة النصوص الغير الرقمية على أنها أرقام و إلخ.

الكود لن يتوقف بخطأ قاتل (“موت”). في أسوأ الأحوال سوف نحصل على NaN كنتيجة.

القيم العددية الخاصة رسمياً هي تعتبر من النوع “رقم” . بالطبع هم ليس أرقام بالمعنى المنطقي للكلمة.

سنرى المزيد من التعامل مع الأرقام خلال هذا الفصل الأعداد.

BigInt

في جافا سكريبت، النوع “number” لا يمثل الأعداد الصحيحة أكبر من (253-1) (و هو 9007199254740991)، أو أقل من -(-253-1) للأرقام السالبة. إنها قيود فنية ناتجة عن تمثيلهم الداخلي.

لمعظم الأغراض هذا يكفي، لكن في بعض الأحيان نحتاج لأرقام كبيرة حقاً ، على سبيل المثال. للتشفير أو الطوابع الزمنية الدقيقة للميكرو ثانية.

BigInt تمت إضافة النوع مؤخرًا إلى اللغة لتمثيل الأعداد الصحيحة ذات الطول الكبير.

قيمة BigInt تنشأ بإلحاق حرف n إلى نهاية الرقم الصحيح:

//  "n" في النهاية تعني أنه من نوع BigInt
const bigInt = 1234567890123456789012345678901234567890n;

بما أن أرقام من نوع BigInt نحتاجها نادراً ، لن يتم تغطيتها هنا ، لكن سيفرد لها فصل مخصص BigInt. اقرأه عندما تحتاج لمثل هذه الأرقام الكبيرة.

مشاكل توافقية

الأن BigInt متوافق مع فايرفوكس/كروم/ايدج/سفاري ،لكن ليست متوافقة مع إنترنت اكسبلورر

You can check MDN BigInt compatibility table to know which versions of a browser are supported.

النص

النص في جافا سكريبت يتم إحاطته بعلامات تنصيص.

let str = "Hello";
let str2 = 'Single quotes are ok too';
let phrase = `can embed another ${str}`;

In JavaScript, there are 3 types of quotes.

  1. علامات التنصيص المزدوجة: "Hello".
  2. علامات التنصيص المفردة: 'Hello'.
  3. الباك تيك: `Hello`.

علامات التنصيص المزدوجة والمفردة هما علامات تنصيص “بسيطة” . عملياً لا يوجد بينهم فرق في جافا سكريبت.

الباك تيك عبارة عن علامات تنصيص “ممتدة وظيفياً” . تسمح لنا بتضمين متغيرات وتعبيرات داخل النص عن طريق إحاطتهم ب ${…}، على سبيل المثال:

let name = "John";

// تضمين متغير
alert( `Hello, ${name}!` ); // Hello, John!

// تضمين تعبير
alert( `the result is ${1 + 2}` ); // the result is 3

التعبير داخل ${…} يتم تقييمه والنتيجة تصبح جزء من النص. نستطيع أن نضع أي شئ هناك: متغير مثل name أو تعبير رياضي مثل 1 + 2 أو شئ أكثر تعقيداً.

من فضلك تذكر الباك تيك وحدها هي من تستطيع فعل ذلك. علامات التنصيص الأخرى لا تحتوي على مثل تلك الوظيفة!

alert( "the result is ${1 + 2}" ); // the result is ${1 + 2} (علامات التنصيص المزدوجة لا تفعل شئ)

سنغطي النصوص بشئ من التفصيل في هذا الفصل السلاسل النصية.

لا يوجد نوع character .

في بعض اللغات، يوجد نوع خاص “character” يعبر عن الحرف الواحد. For example,على سبيل المثال، في لغة سي وجافا يدعى “char”.

في جافا سكريبت، لا يوجد مثل هذا النوع. يوجد نوع واحد فقط: string. النص قد يتكون من صفر حرف (نص فارغ), حرف واحد أو أكثر.

Boolean (logical type)

النوع boolean لديه قيمتين فقط: صواب and خطأ.

هذا النوع غالباً يستخدم لتخزين قيم نعم/لا : true تعني “نعم ، صحيح”، و false تعني “لا، خطأ”.

على سبيل المثال:

let nameFieldChecked = true; // نعم، حقل الإسم تم التأشير عليه
let ageFieldChecked = false; // لا، حقل العمر لم يتم التأشير عليه

القيم المنطقية تأتي أيضاً نتيجة المقارنة:

let isGreater = 4 > 1;

alert( isGreater ); // نعم (نتيجة المقارنة هي "نعم")

سنغطي القيم المنطقية بشكل أعمق في الفصل العوامل المنطقية.

The “null” value

القيمة الخاصة null لا ينتمي إلى أي نوع تم شرحه بالأعلى.

إنه يكون نوع منفصل خاص من نفسه يحتوي على قيمة واحدة هي null:

let age = null;

في جافا سكريبت ، null ليست “مرجع لكائن غير موجود” أو “null pointer” مثل الموجود في لغات أخرى.

إنها مجرد قيمة خاصة تعبر عن “لا شئ” أو “فارغ” أو “قيمة غير معروفة”.

الكود أعلاه يوضح أن age غير معروفة.

The “undefined” value

القيمة الخاصة undefined أيضاً قيمة محايدة. أنها تصنع نوع من نفسها مثل null.

معنى undefined أن “القيمة لم يتم تعيينها”.

عندما يتم تعريف متغير، لكنه غير معين القيمة، عندها تكون قيمته هي undefined:

let age;

alert(age); // تظهر "undefined"

فنياً، يمكن التصريح بتعيين قيمة undefined لمتغير:

let age = 100;

// تغيير القيمة إلى undefined
age = undefined;

alert(age); // "undefined"

…لكن لا ننصح بذلك. في الطبيعي، الشخص يستخدم null لتعيين قيمة “فارغ” أو “غير معروف” لمتغير، بينما undefined محجوزة كقيمة إفتراضية أساسية للأشياء غير المعينة.

Objects and Symbols

النوع كائن هو نوع خاص.

كل الأنواع الأخرى تدعي “بدائية” لأن قيمها تستطيع فقط أن تخزن شئ واحد (قد يكون نص أو رقم أو أي شئ). في المقابل، الكائنات تستخدم لتخزين مجموعة من للبيانات و كيانات أكثر تعقيداً.

لكونها بهذه الأهمية ، الكائنات تستحق معاملة خاصة. سيتم التعامل معهم لاحقاً في هذا الفصل الكائنات، بعد أن نتعلم أكثر عن الأنواع البدائية.

النوع symbol يستخدم لإنشاء معرفات خاصة من الكائنات. يجب أن نذكرهم هنا من أجل الإكتمال،لكن سنؤجل التفاصيل حتى نعرف الكائنات.

The typeof operator

معامل typeof يرجع نوع قيمة المدخلات. إنه مفيد عندما نريد معالجة قيم من أنواع مختلفة بإختلاف أو لمجرد إجراد فحص سريع للنوع .

إنه يدعم نوعين من بناء الكود:

  1. كمعامل: typeof x.
  2. كدالة: typeof(x).

بكلمات أخرى ، إنها تعمل بأقواس أو بدون أقواس. النتيجة ستكون واحدة.

إستدعاء typeof x يرجع نص بإسم نوع القيمة:

typeof undefined // "undefined"

typeof 0 // "number"

typeof 10n // "bigint"

typeof true // "boolean"

typeof "foo" // "string"

typeof Symbol("id") // "symbol"

typeof Math // "object"  (1)

typeof null // "object"  (2)

typeof alert // "function"  (3)

الثلاث سطور الأخيرة قد تحتاج لتوضيح إضافي:

  1. Math كائن مدمج داخلياً لتدعيم العمليات الرياضية. سنتعلمه في الفصل الأعداد. هنا، يخدم فقط كمثال للكائن.
  2. نتيجة typeof null هي "object". هذا رسمياً يعتبر خطأ في سلوك typeof ، يأتي من الأيام الأولى لجافا سكربت وتم الحفاظ عليه من أجل التوافقية. قطعاً null ليس كائن. إنه قيمة خاصة بنوع منفصل خاص.
  3. نتيجة typeof alert هي "function"، لأن alert دالة. سندرس الدوال في الفصول القادمة وهناك سنرى أنه لا توجد نوع خاص “دالة” في جافا سكربت. الدوال الدوال تنتمي للنوع كائن. لكن typeof تعاملهم بشكل مختلف، يرجع "دالة". هذا أيضاً يأتي من الأيام الأولى لجافا سكربت. فنياً، مثل هذا السلوك غير صحيح، لكن قد يكون ملائم في الممارسة.

خلاصة

يوجد 8 أنواع للبيانات في جافا سكربت.

  • number للأرقام من أي نوع: صحيح أو عشري، الأعداد الصحيحة محدودة ب ±(253-1).
  • bigint هو عدد صحيح طوله كبير.
  • string للنصوص. النص قد يحتوي على صفر حرف أو أكثر، لا يوجد نوع منفصل للحرف الواحد.
  • boolean من أجل صواب/خطأ.
  • null للقيم غير المعروفة – نوع قائم بذاته له قيمة واحدة فقط null.
  • undefined للقيم غير المعينة – نوع قائم بذاته له قيمة واحدة فقط undefined.
  • object من أجل هياكل بيانات معقدة.
  • symbol من أجل معرفات فريدة.

معامل typeof يسمح لنا بمعرفة نوع البيانات الموجودة بداخل المتغيرة.

  • له شكلان: typeof x أو typeof(x).
  • يرجع نص بإسم نوع البيانات، مثل "string".
  • من أجل null يرجع "object" – هذا خطأ في اللغة، إنه ليس في الحقيقة كائن.

في الفصول القادمة سنركز على القيم البدائية وعندما نكون متألفين معاهم، سنتجه للكائنات.

مهمه

الأهمية: 5

ما ناتج هذا الكود ؟

let name = "Ilya";

alert( `hello ${1}` ); // ?

alert( `hello ${"name"}` ); // ?

alert( `hello ${name}` ); // ?

Backticks تضمن التعبير داخل ${...} في داخل النص.

let name = "Ilya";

// التعبير هو رقم 1
alert( `hello ${1}` ); // hello 1

// التعبير هو نص "name"
alert( `hello ${"name"}` ); // hello name

// التعبير هو متغير ، يتضمنه
alert( `hello ${name}` ); // hello Ilya
خريطة الدورة التعليمية