القيمة في جافا سكربت دائما تكون من نوع معين . على سبيل المثال نص أو رقم.
توجد 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.
- علامات التنصيص المزدوجة:
"Hello". - علامات التنصيص المفردة:
'Hello'. - الباك تيك:
`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” يعبر عن الحرف الواحد. 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 يرجع نوع قيمة المدخلات. إنه مفيد عندما نريد معالجة قيم من أنواع مختلفة بإختلاف أو لمجرد إجراد فحص سريع للنوع .
إنه يدعم نوعين من بناء الكود:
- كمعامل:
typeof x. - كدالة:
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)
الثلاث سطور الأخيرة قد تحتاج لتوضيح إضافي:
Mathكائن مدمج داخلياً لتدعيم العمليات الرياضية. سنتعلمه في الفصل الأعداد. هنا، يخدم فقط كمثال للكائن.- نتيجة
typeof nullهي"object". هذا رسمياً يعتبر خطأ في سلوكtypeof، يأتي من الأيام الأولى لجافا سكربت وتم الحفاظ عليه من أجل التوافقية. قطعاًnullليس كائن. إنه قيمة خاصة بنوع منفصل خاص. - نتيجة
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"– هذا خطأ في اللغة، إنه ليس في الحقيقة كائن.
في الفصول القادمة سنركز على القيم البدائية وعندما نكون متألفين معاهم، سنتجه للكائنات.
التعليقات
<code>، وللكثير من السطور استخدم<pre>، ولأكثر من 10 سطور استخدم (plnkr, JSBin, codepen…)