القيمة في JavaScript تكون دائمًا من نوع معين. على سبيل المثال، سلسلة أو رقم.
هناك ثمانية أنواع بيانات أساسية في JavaScript. وسنتناولها هنا بشكل عام وفي الفصول التالية سنتحدث عن كل منها بالتفصيل.
يمكننا وضع أي نوع في متغير. على سبيل المثال، يمكن للمتغير أن يكون في لحظة ما عبارة عن سلسلة ثم يقوم بتخزين رقم:
// لا يوجد خطأ دع الرسالة = "مرحبا"؛ الرسالة = 123456;
لغات البرمجة التي تسمح بمثل هذه الأشياء، مثل جافا سكريبت، تسمى “ديناميكية الكتابة”، أي أن هناك أنواع بيانات موجودة، ولكن المتغيرات غير مرتبطة بأي منها.
دع ن = 123؛ ن = 12.345؛
يمثل نوع الرقم كلاً من الأعداد الصحيحة والأرقام الفاصلة العائمة.
هناك العديد من العمليات على الأرقام، على سبيل المثال الضرب *
، القسمة /
، الجمع +
، الطرح -
، وما إلى ذلك.
إلى جانب الأرقام العادية، هناك ما يسمى "القيم الرقمية الخاصة" والتي تنتمي أيضًا إلى نوع البيانات هذا: Infinity
و -Infinity
و NaN
.
تمثل Infinity
اللانهاية الرياضية ∞. إنها قيمة خاصة أكبر من أي رقم.
يمكننا الحصول عليها نتيجة القسمة على صفر:
تنبيه( 1 / 0 ); // إنفينيتي
أو فقط قم بالإشارة إليه مباشرةً:
تنبيه (إنفينيتي)؛ // إنفينيتي
يمثل NaN
خطأ حسابيًا. وهي نتيجة لعملية حسابية غير صحيحة أو غير محددة، على سبيل المثال:
تنبيه ("ليس رقمًا" / 2)؛ // NaN، هذا التقسيم خاطئ
NaN
لزجة. أي عملية حسابية أخرى على NaN
تُرجع NaN
:
تنبيه (NaN + 1)؛ // نان تنبيه (3 * نان)؛ // نان تنبيه ("ليس رقمًا" / 2 - 1)؛ // نان
لذا، إذا كان هناك NaN
في مكان ما في تعبير رياضي، فإنه ينتشر إلى النتيجة بأكملها (هناك استثناء واحد فقط لذلك: NaN ** 0
is 1
).
العمليات الحسابية آمنة
إن إجراء العمليات الحسابية أمر "آمن" في JavaScript. يمكننا أن نفعل أي شيء: القسمة على صفر، والتعامل مع السلاسل غير الرقمية كأرقام، وما إلى ذلك.
لن يتوقف البرنامج النصي أبدًا عن خطأ فادح ("يموت"). في أسوأ الأحوال، سوف نحصل على NaN
كنتيجة.
تنتمي القيم الرقمية الخاصة رسميًا إلى النوع "الرقم". وبالطبع فهي ليست أرقامًا بالمعنى السليم لهذه الكلمة.
سنرى المزيد حول التعامل مع الأرقام في فصل الأرقام.
في JavaScript، لا يمكن أن يمثل النوع "number" بشكل آمن قيمًا صحيحة أكبر من (2 53 -1)
(أي 9007199254740991
)، أو أقل من -(2 53 -1)
للقيم السالبة.
لكي نكون دقيقين حقًا، يمكن للنوع "number" تخزين أعداد صحيحة أكبر (حتى 1.7976931348623157 * 10 308
)، ولكن خارج نطاق الأعداد الصحيحة الآمنة ±(2 53 -1)
سيكون هناك خطأ في الدقة، لأنه ليست كل الأرقام مناسبة في وحدة التخزين الثابتة 64 بت. لذلك قد يتم تخزين قيمة "تقريبية".
على سبيل المثال، هذين الرقمين (فوق النطاق الآمن مباشرةً) متماثلان:
console.log(9007199254740991 + 1); // 9007199254740992 console.log(9007199254740991 + 2); // 9007199254740992
لذلك لنفترض أن جميع الأعداد الصحيحة الفردية الأكبر من (2 53 -1)
لا يمكن تخزينها على الإطلاق في النوع "الرقم".
بالنسبة لمعظم الأغراض، يكون النطاق ±(2 53 -1)
كافيًا، ولكن في بعض الأحيان نحتاج إلى النطاق الكامل للأعداد الصحيحة الكبيرة حقًا، على سبيل المثال للتشفير أو الطوابع الزمنية ذات الدقة بالميكروثانية.
تمت إضافة نوع BigInt
مؤخرًا إلى اللغة لتمثيل الأعداد الصحيحة ذات الطول العشوائي.
يتم إنشاء قيمة BigInt
عن طريق إلحاق n
بنهاية عدد صحيح:
// تعني كلمة "n" في النهاية أنها BigInt const bigInt = 1234567890123456789012345678901234567890n;
وبما أن أرقام BigInt
نادراً ما تكون هناك حاجة إليها، فإننا لا نغطيها هنا، ولكننا خصصنا لها فصلاً منفصلاً عن BigInt. اقرأها عندما تحتاج إلى مثل هذه الأرقام الكبيرة.
يجب أن تكون السلسلة في JavaScript محاطة بعلامات اقتباس.
دع str = "مرحبًا"; Let str2 = 'علامات الاقتباس المفردة مناسبة أيضًا'; Let العبارة = `يمكن تضمين ${str}` آخر؛
في JavaScript، هناك 3 أنواع من علامات الاقتباس.
اقتباسات مزدوجة: "Hello"
.
اقتباسات مفردة: 'Hello'
.
باكتيككس: `Hello`
.
علامات الاقتباس المزدوجة والمفردة هي علامات اقتباس "بسيطة". لا يوجد فرق عمليًا بينهما في JavaScript.
علامات التبويب الخلفية هي علامات اقتباس "للوظائف الموسعة". إنها تسمح لنا بتضمين المتغيرات والتعبيرات في سلسلة عن طريق تغليفها في ${…}
، على سبيل المثال:
اسمحوا الاسم = "جون"؛ // تضمين متغير تنبيه( `مرحبا، ${name}!` ); // مرحبا جون! // تضمين تعبير تنبيه( `النتيجة هي ${1 + 2}` ); // النتيجة هي 3
يتم تقييم التعبير الموجود داخل ${…}
وتصبح النتيجة جزءًا من السلسلة. يمكننا وضع أي شيء هناك: متغير مثل name
أو تعبير حسابي مثل 1 + 2
أو شيء أكثر تعقيدًا.
يرجى ملاحظة أن هذا لا يمكن القيام به إلا في backticks. علامات الاقتباس الأخرى لا تحتوي على وظيفة التضمين هذه!
تنبيه ("النتيجة هي ${1 + 2}")؛ // النتيجة هي ${1 + 2} (علامات الاقتباس المزدوجة لا تفعل شيئًا)
سنقوم بتغطية السلاسل بشكل أكثر شمولاً في فصل السلاسل.
لا يوجد نوع الحرف .
في بعض اللغات، يوجد نوع "حرف" خاص لحرف واحد. على سبيل المثال، في لغة C وفي Java يطلق عليه "char".
في جافا سكريبت، لا يوجد مثل هذا النوع. هناك نوع واحد فقط: string
. قد تتكون السلسلة من صفر أحرف (تكون فارغة)، أو حرف واحد أو العديد منها.
يحتوي النوع المنطقي على قيمتين فقط: true
و false
.
يُستخدم هذا النوع عادةً لتخزين قيم نعم/لا: true
يعني "نعم، صحيح"، false
يعني "لا، غير صحيح".
على سبيل المثال:
دع nameFieldChecked = true; // نعم، تم فحص حقل الاسم دع ageFieldChecked = false; // لا، لم يتم تحديد حقل العمر
تأتي القيم المنطقية أيضًا نتيجة للمقارنات:
دعها أكبر = 4 > 1; تنبيه (أكبر)؛ // صحيح (نتيجة المقارنة هي "نعم")
سنتناول القيم المنطقية بشكل أكثر عمقًا في فصل العوامل المنطقية.
لا تنتمي القيمة null
الخاصة إلى أي من الأنواع الموضحة أعلاه.
إنه يشكل نوعًا منفصلاً خاصًا به والذي يحتوي فقط على القيمة null
:
دع العمر = فارغ؛
في JavaScript، null
ليست "مرجعًا إلى كائن غير موجود" أو "مؤشر فارغ" كما هو الحال في بعض اللغات الأخرى.
إنها مجرد قيمة خاصة تمثل "لا شيء" أو "فارغة" أو "قيمة غير معروفة".
يشير الرمز أعلاه إلى أن age
غير معروف.
القيمة الخاصة undefined
تقف أيضًا منفصلة. إنه يصنع نوعًا خاصًا به، تمامًا مثل null
.
معنى undefined
هو "لم يتم تعيين القيمة".
إذا تم الإعلان عن متغير، ولكن لم يتم تعيينه، فإن قيمته undefined
:
دع العمر؛ تنبيه (العمر)؛ // يظهر "غير محدد"
من الناحية الفنية، من الممكن تعيين undefined
بشكل صريح لمتغير:
دع العمر = 100؛ // قم بتغيير القيمة إلى غير محددة العمر = غير محدد؛ تنبيه (العمر)؛ // "غير محدد"
…لكننا لا ننصح بفعل ذلك. عادةً، يستخدم المرء null
لتعيين قيمة "فارغة" أو "غير معروفة" لمتغير، بينما يتم حجز قيمة undefined
كقيمة أولية افتراضية للأشياء غير المخصصة.
نوع object
خاص.
تسمى جميع الأنواع الأخرى "بدائية" لأن قيمها يمكن أن تحتوي على شيء واحد فقط (سواء كان سلسلة أو رقمًا أو أي شيء آخر). في المقابل، يتم استخدام الكائنات لتخزين مجموعات من البيانات والكيانات الأكثر تعقيدًا.
ولكونها بهذه الأهمية، فإن الأشياء تستحق معاملة خاصة. سنتعامل معها لاحقًا في فصل الكائنات، بعد أن نتعلم المزيد عن الأوليات.
يتم استخدام نوع symbol
لإنشاء معرفات فريدة للكائنات. وعلينا أن نذكرها هنا من أجل الاكتمال، ولكن أيضًا نؤجل التفاصيل حتى نعرف الأشياء.
يقوم عامل التشغيل typeof
بإرجاع نوع المعامل. يكون ذلك مفيدًا عندما نريد معالجة قيم من أنواع مختلفة بشكل مختلف أو نريد فقط إجراء فحص سريع.
يؤدي استدعاء typeof x
إلى إرجاع سلسلة باسم النوع:
نوع غير محدد // "غير محدد" نوع 0 // "رقم" نوع 10n // "كبير" النوع صحيح // "منطقي" نوع "foo" // "سلسلة" نوع الرمز ("المعرف") // "الرمز" نوع الرياضيات // "كائن" (1) نوع فارغ // "كائن" (2) نوع التنبيه // "الوظيفة" (3)
قد تحتاج الأسطر الثلاثة الأخيرة إلى شرح إضافي:
Math
عبارة عن كائن مضمن يوفر عمليات رياضية. سنتعرف عليه في فصل الأرقام. هنا، فهو بمثابة مثال للكائن فقط.
نتيجة typeof null
هي "object"
. هذا خطأ معترف به رسميًا في typeof
، يعود إلى الأيام الأولى لجافا سكريبت ويتم الاحتفاظ به من أجل التوافق. بالتأكيد، null
ليس كائنًا. إنها قيمة خاصة لها نوع منفصل خاص بها. سلوك typeof
خاطئ هنا.
نتيجة typeof alert
هي "function"
، لأن alert
عبارة عن وظيفة. سندرس الوظائف في الفصول التالية حيث سنرى أيضًا أنه لا يوجد نوع "وظيفة" خاص في JavaScript. تنتمي الوظائف إلى نوع الكائن. لكن typeof
يعاملهم بشكل مختلف، ويعيد "function"
. يأتي ذلك أيضًا من الأيام الأولى لجافا سكريبت. من الناحية الفنية، هذا السلوك ليس صحيحًا، ولكنه قد يكون مناسبًا من الناحية العملية.
بناء الجملة typeof(x)
قد تصادف أيضًا بناء جملة آخر: typeof(x)
. إنه نفس typeof x
.
لتوضيح الأمر: typeof
هو عامل تشغيل، وليس وظيفة. الأقواس هنا ليست جزءًا من typeof
. إنه نوع الأقواس المستخدمة للتجميع الرياضي.
عادة، تحتوي هذه الأقواس على تعبير رياضي، مثل (2 + 2)
، لكنها تحتوي هنا على وسيطة واحدة فقط (x)
. من الناحية النحوية، فهي تسمح بتجنب وجود مسافة بين عامل التشغيل والوسيط typeof
به، وقد أعجب بعض الأشخاص بذلك.
يفضل بعض الأشخاص typeof(x)
، على الرغم من أن بناء جملة typeof x
أكثر شيوعًا.
هناك 8 أنواع بيانات أساسية في JavaScript.
سبعة أنواع من البيانات البدائية:
number
للأرقام من أي نوع: عدد صحيح أو فاصلة عائمة، الأعداد الصحيحة محدودة بـ ±(2 53 -1)
.
bigint
للأعداد الصحيحة ذات الطول التعسفي.
string
للسلاسل. قد تحتوي السلسلة على صفر أحرف أو أكثر، ولا يوجد نوع منفصل مكون من حرف واحد.
boolean
true
/ false
.
null
للقيم غير المعروفة - نوع مستقل له قيمة واحدة null
.
undefined
للقيم غير المخصصة - نوع مستقل له قيمة واحدة undefined
.
symbol
للمعرفات الفريدة.
ونوع بيانات واحد غير بدائي:
object
لهياكل البيانات الأكثر تعقيدا.
يتيح لنا عامل التشغيل typeof
معرفة النوع المخزن في المتغير.
يُستخدم عادةً typeof x
، ولكن من الممكن أيضًا استخدام typeof(x)
.
تُرجع سلسلة باسم النوع، مثل "string"
.
بالنسبة إلى "object"
يُرجع null
- فهذا خطأ في اللغة، وهو ليس كائنًا في الواقع.
في الفصول القادمة، سنركز على القيم البدائية وبمجرد أن نتعرف عليها، سننتقل إلى الكائنات.
الأهمية: 5
ما هو إخراج البرنامج النصي؟
اسمحوا اسم = "ايليا"؛ تنبيه( `مرحبا ${1}` ); // ؟ تنبيه( `مرحبا ${"name"}` ); // ؟ تنبيه( `مرحبا ${name}` ); // ؟
تقوم العلامات الخلفية بتضمين التعبير داخل ${...}
في السلسلة.
اسمحوا اسم = "ايليا"؛ // التعبير هو رقم 1 تنبيه( `مرحبا ${1}` ); // مرحبا 1 // التعبير عبارة عن سلسلة "اسم" تنبيه( `مرحبا ${"name"}` ); // مرحبا الاسم // التعبير متغير، قم بتضمينه تنبيه( `مرحبا ${name}` ); // مرحبا ايليا