const في JavaScript

من موسوعة حسوب
مراجعة 04:07، 17 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

الثوابت (constants) تكون تابعةً للمجال الكتلي (block scope) بما يُشبه المتغيرات المُعرَّفة عبر التعبير let، لكن قيمة الثوابت لا يمكن أن تتغير عبر إعادة إسناد القيمة، ولا يمكن إعادة تصريحها.

البنية العامة

const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];

nameN

اسم الثابت، ويمكن أن يكون أيّ معرِّف صالح في JavaScript.

valueN

قيمة الثابت، ويمكن استخدام أيّ تعبير (expression) صالح في JavaScript بما في ذلك الدوال.

الوصف

تكون الثوابت إما عامةً أو محليةً وتابعةً لمجال تعريفها، لكن الثوابت العامة لن تصبح خاصياتٍ للكائن العام (global object) على النقيض من المتغيرات المُعرَّفة عبر var؛ لاحظ أنَّ من الضروري تهيئة قيمة الثابت مباشرةً، أي يجب توفير القيمة في نفس التعبير الذي يُصرِّح عن الثابت، وهذا أمرٌ منطقيٌ لأنَّ من غير الممكن تغيير قيمة الثابت لاحقًا.

التصريح عن الثوابت عبر const سيؤدي إلى إنشاء مرجعية للقراءة فقط إلى قيمةٍ ما؛ وهذا لا يعني أنَّ القيمة المرتبطة بالثوابت غير قابلة للتعديل، وإنما مُعرِّف المتغير لا يمكن إعادة إسناد قيمة جديدة إليه، فمثلًا لو كانت القيمة المرتبطة بالثابت هي كائن، فهي يعني أنَّ محتويات الكائن (أي خاصياته) يمكن تعديلها.

جميع الأمور التي تتعلق بالمنطقة الميتة زمنيًا (temporal dead zone) تنطبق على let و const على حدٍ سواء.

أمثلة

المثال الآتي يوضِّح سلوك الثوابت، جرِّبه على سطر أوامر متصفحك (console).

لاحظ أننا نستطيع التصريح عن الثوابت بأحرفٍ بالحالة الكبيرة أو الصغيرة، لكن من الشائع تعريف الثوابت بأحرفٍ كبيرةٍ لتسهيل تمييزها عن المتغيرات.

سنُعرِّف في المثال الآتي ثابتًا باسم MY_FAX وسنعطيه القيمة 7، لاحظ أنَّ محاولة إسناد قيمة جديدة لها ستؤدي إلى رمي خطأ، ولا يمكن إعادة التصريح مجددًا عن ثابت بنفس الاسم، ولا يمكن إنشاء متغيرات (عبر var أو let) لها نفس اسم الثابت.

من المهم ملاحظة ما هو أثر المجالات الكتلية، فمن الممكن إعادة تصريح متغير (عبر let) بنفس اسم الثابت، لكن المتغيرات المُصرَّح عنها عبر var لن تكون خاصةً بالمجال الكتلي وستؤدي إلى رمي خطأ.

// تعريف الثابت وإسناد القيمة 7 إليه
const MY_FAV = 7;

// Uncaught TypeError: Assignment to constant variable.
MY_FAV = 20;

// 7
console.log('my favorite number is: ' + MY_FAV);

// Uncaught SyntaxError: Identifier 'MY_FAV' has already been declared
const MY_FAV = 20;

// هذا الاسم محجوز للثابت ولا يجوز استخدامه كمتغير
var MY_FAV = 20;

// لا يجوز ذلك أيضًا
let MY_FAV = 20;

// من المهم ملاحظة أثر المجالات الكتلية
if (MY_FAV === 7) { 
    // من الممكن إنشاء متغير محلي بنفس اسم الثابت
    let MY_FAV = 20;

    // 20
    console.log('my favorite number is ' + MY_FAV);

    // سيُرمى خطأ لأن هذا المتغير سيُعرَّف في نفس مجال الثابت
    var MY_FAV = 20;
}

// 7
console.log('my favorite number is ' + MY_FAV);

تذكَّر أنَّ من الضروري إسناد قيمة للثابت عند التصريح عنه، وإلا فسيُرمى خطأ. لاحظ أيضًا أنَّ من الممكن استخدام الثوابت مع الكائنات، ويمكن الوصول إلى خاصياته:

// Uncaught SyntaxError: Missing initializer in const declaration
const FOO; 

// يمكن استعمال الثوابت مع الكائنات
const MY_OBJECT = {'key': 'value'};

// محاولة إسناد كائن جديد إلى الثابت
// Uncaught TypeError: Assignment to constant variable.
MY_OBJECT = {'OTHER_KEY': 'value'};

// لكن خاصيات الكائن غير محمية
// لذا يمكن تنفيذ ما يلي دون مشاكل
MY_OBJECT.key = 'otherValue'; // استخدم الدالة لجعل الكائن غير قابل للتعديل Object.freeze() 

// ينطبق المثل على المصفوفات
const MY_ARRAY = [];
// من الممكن إضافة عناصر جديدة إلى المصفوفة
MY_ARRAY.push('A'); // ["A"]
// لكن لا يمكن إسناد مصفوفة جديدة إليه
// Uncaught TypeError: Assignment to constant variable.
MY_ARRAY = ['B'];

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي 21 36 11 نعم 5.1

مصادر ومواصفات