دلوقتي هنتكلم عن جملة مهمة جداً ومشهورة بنشوفها دايماً في الـ MDN (مرجع الـ JavaScript الأساسي) لما بييجوا يوصفوا اللغة دي، والجملة دي هي: “JavaScript is a loosely typed and dynamic language.”
الجملة دي فيها مفهومين أساسيين لازم تفهمهم كويس عشان تعرف الـ JavaScript بتفكر إزاي.
JavaScript: Loosely Typed & Dynamic
1. Loosly Typed Language ⇒ Weakly Typed
يعني إيه الـ JavaScript لغة “Loosely Typed”؟ عشان نفهم ده، لازم نقارنها بلغات تانية بنسميها Strongly Typed زي الـ C# والـ C++.
في اللغات الـ Strongly Typed، لما بتيجي تعرف الـ Variable، اللغة بتجبرك إنك تحدد نوعه من البداية خالص قبل ما تعمل أي حاجة. مثلاً في الـ C++ لازم تكتب:
string username; // You must define it as a string firstلكن في الـ JavaScript، الموضوع “Loosely” أو مرن جداً. إنت بتعرف الـ Variable باستخدام var أو let مثلاً، ومش بتقول للغة النوع ده إيه.
var x; // No type defined yetهنا الـ JavaScript بتستنى تشوف إنت هتحط إيه في الـ x ده؛ سواء حطيت Number، أو String، أو حتى Boolean، هي مش هتقولك لأ.
2. Dynamic Language
المفهوم التاني هو إن الـ JavaScript لغة Dynamic (ديناميكية). وده معناه إن نوع الـ Variable ممكن يتغير وهو شغال (at Runtime).
لو رجعنا للغات الـ Strongly Typed زي الـ C#، لو عرفت الـ Variable إنه string:
string username = "CornPop";
username = 3; // Error! This will blow up in your faceالـ C# هتقولك: “إنت مجنون؟ إنت قايلي من الأول إنه String، إزاي تديله رقم دلوقتي؟“. النوع ثابت مبيتغيرش.
أما في الـ JavaScript، فالموضوع فيه حرية كاملة (Dynamic). إنت ممكن تغير نوع الـ Variable وقيمته في أي وقت وإنت شغال:
var x = 'Ahmed'; // Now it's a string
console.log(typeof x); // Output: string
x = 3; // Now it's a number
console.log(typeof x); // Output: number
x = false; // Now it's a boolean
console.log(typeof x); // Output: boolean
x = 'Seham'; // Back to string again
console.log(typeof x); // Output: stringالـ JavaScript شغالة معاك زي الفل، وفي كل سطر الـ typeof x بيتغير بناءً على القيمة اللي موجودة فيه حالياً.
Notes
- الـ PHP هي لغة Loosely Typed، وده حقيقي فعلاً، بس الـ PHP في الإصدارات الأخيرة بدأت تضيف ميزات الـ Type Hinting عشان تقرب شوية من الـ Strongly Typed في الـ Functions والـ Classes لزيادة الأمان.
- كلمة Dynamic هنا مقصود بيها “Dynamic Typing”. ده معناه إن عملية الـ Type Checking (التأكد من نوع البيانات) بتحصل وقت تشغيل الكود (Runtime) مش وقت الـ Compilation.
- الـ TypeScript: لو إنت شغال في مشروع كبير وخايف من حرية الـ JavaScript دي (إن الـ Variable يتغير نوعه فجأة ويسبب مشاكل)، المبرمجين بيستخدموا حاجة اسمها TypeScript. هي عبارة عن “طبقة” فوق الـ JavaScript بتخليها Strongly Typed عشان تمسك الـ Errors بدري وإنت بتكتب الكود.
- الـ Performance: اللغات الـ Dynamic زي الـ JavaScript بتبقى أبطأ سنة بسيطة في التنفيذ مقارنة بالـ Static languages، لأن الـ Engine بيحتاج يعمل “Check” لنوع الـ Variable كل شوية وهو شغال.
- الـ .NET (زي C#) لغة Statically Typed في الأساس، لكن المطورين ضافوا فيها كلمة
dynamic(من أول .NET 4.0). - لما بتستخدم
dynamicفي الـ C#، إنت بتقول للـ Compiler: “سيبني أتعامل مع الـ Variable ده زي الـ JavaScript بالظبط، متعملش Check للنوع غير وقت الـ Runtime”.