Jannah Theme License is not validated, Go to the theme options page to validate the license, You need a single license for each domain name.

كيف تتحقق من نوع البيانات في JavaScript باستخدام typeof وبطرق أخرى

أنواع JavaScript: ما هي وكيف تتحقق منها؟

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

ide-interface-displaying-some-javascript-code كيف تتحقق من نوع البيانات في JavaScript باستخدام typeof وبطرق أخرى

كما هو الحال مع معظم لغات البرمجة، تتعامل جافا سكريبت مع أنواع مختلفة من القيم بشكل مختلف. فسلسلة نصية مثل “Hello world” تختلف اختلافًا كبيرًا عن رقم مثل 42. ولكن ما هي الأنواع المتاحة، ولماذا تُعدّ مهمة؟

ما هي أنواع بيانات JavaScript؟

لكل قيمة في جافا سكريبت نوع، وهو واحد من هذه الأنواع التسعة:

  • Number
  • String
  • Boolean
  • Null
  • Undefined
  • BigInt
  • Symbol
  • Object
  • Function

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

المتغير الذي لم تُعيّن له قيمة سيكون له قيمة غير مُعرّفة. على سبيل المثال:

> var foo
  undefined

القيم المنطقية إما أن تكون صحيحة أو خاطئة، وتُستخدم عادةً في المنطق الشرطي.

تُخزّن السلاسل النصية قيمًا نصية مثل “hello” و”$$$” و”A few words”. تُخزّن سلاسل JavaScript بتنسيق UTF-16. عمليًا، هذا يعني أنه يمكنك استخدام رموز Unicode، مثل الرموز التعبيرية، في حروف السلاسل النصية.

alert("🙂")

وسوف يعمل كل شيء كما هو متوقع:

javascript-alert-emoji كيف تتحقق من نوع البيانات في JavaScript باستخدام typeof وبطرق أخرى

بخلاف العديد من لغات البرمجة الأخرى، لا تُميّز جافا سكريبت بين الأعداد الصحيحة والأعداد العشرية. 42 و3.14 كلاهما من نوع Number. BigInt، كما يوحي اسمه، لا يغطي إلا الأعداد الصحيحة، وتلك التي تتجاوز قيمتها ما يمكن لـ Number التعامل معه.

ملاحظة
قيم BigInt كبيرة جدًا. جرّب تشغيل هذا الكود في وحدة التحكم لملء صفحتك الحالية بعدد كبير جدًا:

b = document.body, b.style.overflowWrap = "break-word",
 b.textContent = BigInt(2) ** BigInt(200000)

Null قيمة خاصة تُستخدم لتمثيل “غياب أي قيمة”. قد يبدو هذا متناقضًا، ولكنه مفيد في البرمجة الكائنية التوجه، حيث يمكن لمراجع الكائنات تمثيل العلاقات:

var anne = { name: "Anne", child: null };
var john = { name: "John", child: child }

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

اقرأ أيضا:  كيفية تشفير وفك تشفير Base64 على Notepad ++

الدوال والكائنات هي قيم يمكنك إنشاؤها باستخدام آليات مختلفة، بما في ذلك بناء الجملة الحرفية للغة:

function my_function() { ... }

let my_object = {};

يمكنك أيضًا إنشاء قيمة دالة باستخدام تعبير:

my_function = function() { ... };

ويمكنك إنشاء كائن باستخدام المنشئ:

let answer = new Object(42);

ما وظيفة النوع؟

أولاً، من المهم ملاحظة أن قيم جافا سكريبت لها أنواع ثابتة، بينما المتغيرات ليست كذلك. متغير جافا سكريبت مُصنّف ديناميكيًا، لذا فهو يتبنى نوع قيمته مهما كان:

> var foo = 1;
> typeof foo
  'number'

> foo = "hello"
> typeof foo
  'string'

ملاحظة
يُرجع مُعامل typeof سلسلة نصية تحتوي على نوع مُعامله. راجع القسم التالي لمزيد من المعلومات.

من أكبر تأثيرات الأنواع هو عند مقارنة قيمتين. تحتوي جافا سكريبت على مُعاملي مساواة: == و ===. يتحقق هذان المُعاملان من المساواة “الفضفاضة” و”الصارمة” على التوالي، ويكمن الفرق في النوع.

function check_equals(a, b) {
if (a === b) {
console.log("a and b are strictly equal");
    } else if (a == b) {
console.log("a and b are loosely equal");
    } else {
console.log("a and b are not equal at all");
    }
}

إذا استدعيت check_equals(42, 42)، فستجد أن القيمتين متساويتان تمامًا: لهما نفس القيمة والنوع. لكن check_equals(42, “42”) ستوضح أنه على الرغم من إمكانية تقييم رقم وسلسلة نصية بنفس القيمة، إلا أنهما لا يزالان من نوعين مختلفين، لذا فهما متساويان بشكل تقريبي فقط.

اقرأ أيضا:  لماذا يتوقف OneDrive فجأة عن مزامنة الملفات وكيف تعيد تشغيله

يُعد فحص المساواة التقريبي مثالًا على فرض النوع: التحويل التلقائي لقيمة من نوع إلى آخر. هذه ميزة تجنّب الحاجة إلى تحويل القيم صراحةً.

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

let person = { age: 21 };

if (person.age) {
    alert("person has been born!");
}

في هذه الحالة، نوع person.age هو “number”، لكن جافا سكريبت تُجبره على قيمة منطقية عند تقييم الشرط في جملة if. تقريبًا كل رقم، سواءً كان موجبًا أم سالبًا، سيتحول إلى “true” عند إجباره على قيمة منطقية. لكن 0 سيتحول إلى false، لذا يُعدّ الإجبار اختصارًا مفيدًا لتجنب كتابة if (person.age !== 0).

نصيحة
هناك قيمتان رقميتان أخريان تُجبران على القيمة false: -0 وNaN. NaN هي قيمة خاصة تُشير إلى “ليس رقمًا” وتُمثل نتائج تعبير غير صحيحة مثل 42 / “hello”. لاحظ أن typeof NaN تُرجع القيمة ‘number’! أنواع أخرى لديها أيضًا قيم تُجبر على القيمة false، مثل السلسلة النصية الفارغة (“”).

قد لا تتوقع أن يُجبر نوع ما بطريقة معينة. على سبيل المثال، [] == “” سيُرجع القيمة true لأن كلتا القيمتين مُجبرتان على القيمة المنطقية false. قواعد تحويل القيم إلى أخرى، في ظروف مختلفة، طويلة ويصعب تذكرها. لتجنب ذلك، استخدم === كلما أمكن.

كيف تستخدم الأنواع في شيفرة جافا سكريبت؟

للتحقق من نوع متغير، يمكنك استخدام عامل typeof. على سبيل المثال:

function reset_value(val) {
switch (typeof val) {
case "object":
return {};

case "string":
return "";

case "number":
return 0;
    }
}

ملاحظة
typeof null يُرجع ‘object’. يُعتبر هذا خطأً في تصميم اللغة، وقد بُذلت محاولة لإصلاحه، لكن الحاجة إلى التوافق مع الإصدارات السابقة عبر الإنترنت جعلت هذا التغيير غير عملي. للتحقق من null، استخدم === null.

اقرأ أيضا:  تحويل صورة تحتوي على جدول إلى Google Sheets بسهولة

قد تتساءل عن مكان المصفوفات في نظام أنواع جافا سكريبت. إنها تبدو كنوع مميز من القيم:

let myArray = [ "apple", "banana", "cherry" ];

ومع ذلك، يعتبر JavaScript المصفوفة بمثابة نوع من الكائنات:

> typeof [ 1, 2, 3 ]
'object'

قد يكون هذا غير مريح، ولكن يمكنك التحقق مما إذا كان الكائن عبارة عن مصفوفة على وجه التحديد باستخدام طريقة isArray الثابتة لفئة Array:

> Array.isArray([1, 2, 3])
true

يُعدّ تغيير النوع مصدرًا غنيًا بالأخطاء وسوء الفهم. على سبيل المثال:

> "42" + "18"
'4218'
> "42" + 18
'4218'
> 42 + "18"
'4218'

في كل الأحوال، عند جمع عددين أحدهما سلسلة نصية، ستُنتج قيمة سلسلة نصية تجمعهما كسلاسل نصية. ويرجع ذلك إلى أن مُعامل + مُثقلٌ جدًا بحيث لا تعمل السلاسل النصية كمعامل تجميع بدلًا من جمع حسابي.

مع ذلك، لا ينطبق هذا على الضرب:

> "42" * 2
84
> "42" * "2"
84

هذه هي الحالة المعاكسة: يُجبر المُعامل * أي قيم نصية إلى أرقام، بشرط أن تبدو كأرقام.

يُشبه تحويل النوع عملية إجبار النوع، ولكنه يُحوّل القيمة صراحةً إلى نوع مختلف. ومن الاستخدامات الشائعة لهذا تحويل سلسلة نصية إلى رقم:

> let pageNum = new URLSearchParams(document.location.search).get("page");
> pageNum
'1'
> parseInt(pageNum)
1

يمكنك أيضًا إنشاء قيمة من نوع معين باستخدام وظائف التغليف المضمنة لكل بدائي (باستثناء null وغير المحدد): Boolean، وNumber، وBigInt، وString، وSymbol.

> Number("42") + 18
60

التحقق من نوع البيانات خطوة أساسية في كتابة شيفرة نظيفة وفعّالة في JavaScript. استخدام typeof يُعد كافيًا في أغلب الحالات، لكن عند التعامل مع الكائنات أو الحالات الأكثر تعقيدًا، يصبح من المفيد استخدام أدوات إضافية مثل instanceof أو Object.prototype.toString. كل طريقة لها مكانها المناسب، ومع الوقت ستصبح قادرًا على اختيار الأداة الأفضل للموقف الصحيح.

زر الذهاب إلى الأعلى