اذهب إلى المحتوى

السؤال

نشر (معدل)
name = 'bader';

console.log(typeof name);

name = 5;

console.log(typeof name);

الأستاذ شرح أنه لا نستطيع تغيير قيمة الثوابت في درس أساسيات البرمجة باستخدام جافاسكريبت في دورة علوم الحاسب لكن أنا استطعت تغيير القيمة فلماذا حدث ذلك؟

 

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال ونص السؤال

Recommended Posts

  • 0
نشر

بالطبع لا فما تقصده هو  استخدام الكلمة المحجوزة const لتعريف الثوابت، وقد تم توضيح ذلك بالتفصيل هنا:

وبخصوص الكود الخاص بك، فهو غير صحيح حيث أنك قمت باستخدام خاصية name الموجودة في الكائن window وقمت بتغيير قيمتها.

وعليك بقراءة التالي قبل استكمال الشرح لتفهم ما أقصده:

وفي الكود لديك"name" قمت أنت بتعريفها ضمن النطاق العالمي global ضمن كائن "window"، بتعيين قيمة السلسلة النصية "bader" للمتغير "name"، ثم طباعة نوع المتغير باستخدام "console.log(typeof name);" وسيتم طباعة "string" في الإخراج لأن قيمة المتغير هي سلسلة نصية.

ثم، قمت أنت بتعيين قيمة رقمية 5 للمتغير "name"، وبعد ذلك طباعة نوع المتغير مرة أخرى باستخدام "console.log(typeof name);" وستظهر "string" أيضًا، ولكن لماذا لم تصبح رقم number؟

السبب أنه تم تغيير القيمة النصية فقط من "bader" إلى "5" أي أنه لم يتم تحويل القيمة، وتلك المشاكل الغريبة ستحدث لو لم تقم باستخدام أحد الكلمات الخاصة بتعريف المتغيرات وهم var و let و const.

أي يجب أن يكون الكود لديك كالتالي:

const userName = 'bader';

console.log(typeof name);

userName = 5;

console.log(typeof name);

وستجد أنه يظهر لك خطأ 

caught TypeError: Assignment to constant variable.
  

والذي يعني أنك لا تستطيع تغيير قيمة متغير ثابت.

  • 0
نشر
بتاريخ 3 ساعة قال Your Nextkwt:

شكرا لك 

Screenshot 2023-06-09 152317.png

هي لا تسمى متغيرات ثابتة على نحو دقيق، فهي ثوابت وفقط. ولا يمكن تغيير قيمتها بطبيعة الحال لأنها كذلك. فهي ثابتة لا يفترض أن تتغير وإلا فلماذا قمنا أصلا بتصريحها واستعمالها.

وما يظهر في الصورة لا يفترض به أن يخبرك أنه ثابت أو متغير، وإنما يقوم بإخبارك عن نوع بيانات المتغير أو الثابت المسند له. فمرة يخبرنا أنه string أو سلسلة نصية، ومرة يخبرنا أنه integer أو عدد وما نحو ذلك. 

في جافاسكربرت لا يمكن التحقق بشكل مباشر مما ان كان شيء ما متغيرا أو ثابتا، ولكن يمكنك القيام بدالة مخصصة تقوم لك بذلك. مثال:

var value = 42; // variable
const PI = 3.14; // constant

console.log(typeOfSomething(value)); // خرج: variable
console.log(typeOfSomething(PI)); // خرج: constant

function typeOfSomething(value) {
  try {
    value = 10; // جرب اسناد قيمة
    return "variable";
  } catch (error) { // في حالة تعطل الاسناد فهو حتما ثابت
    return "constant";
  }
}

 

  • 0
نشر

في الواقع، الثوابت في جافاسكريبت لا يمكن تغيير قيمتها بعد ان تم تعريفها، وهذا ما يميزها عن المتغيرات. ولكن في الكود الذي وضعته، لم تقم بتعريف الثابت باستخدام الكلمة الأساسية "const"، بل استخدمت "let" أو "var" وهما يستخدمان لتعريف المتغيرات كما وضح مصطفى في التعليق السابق.

لذلك، فإن القيام بتغيير قيمة المتغير في هذه الحالة ممكن. ولكن إذا كنت تحاول تغيير قيمة الثابت الذي تم تعريفه باستخدام const، سيتم إرجاع خطأ في وحدة التحكم بالمتصفح (console) ولن تتمكن من تغيير قيمته. 

لذلك، يجب دائمًا استخدام "const" لتعريف الثوابت إذا كنت تريد تأكيد عدم القدرة على تغيير قيمتها فيما بعد.

ولكن لماذا  المتغيرات الثابتة const في جافاسكريبت لا نستطيع تغيير قيمتها ما الإستفادة من ذلك ؟

  • منع التغيير العرضي: باستخدام الثوابت const، يمكن منع تغيير القيم الثابتة خلال تنفيذ البرنامج، وبالتالي تجنب الأخطاء الناتجة عن التغييرات العرضية غير المتوقعة في القيم.
  • تحسين القراءة والفهم: باستخدام الثوابت const، يمكن تحسين قراءة وفهم الكود، حيث يمكن التعرف بسرعة على القيم الثابتة والتي لن تتغير خلال تنفيذ البرنامج.
  • تحسين الأداء: يمكن أن يؤدي استخدام الثوابت const إلى تحسين الأداء، حيث تتم معالجة الثوابت في وقت الترجمة وليس في وقت التنفيذ، مما يجعل البرنامج أسرع.
  • تقليل الأخطاء: باستخدام الثوابت const، يمكن تقليل الأخطاء الناتجة عن تغيير القيم الثابتة بالخطأ، مما يجعل البرنامج أكثر موثوقية.
  • المساعدة في الصيانة: باستخدام الثوابت const، يمكن تسهيل عملية الصيانة والتعديل على البرنامج بشكل عام، حيث يمكن تحديد القيم الثابتة الهامة وتغييرها بشكل سهل في حالة الحاجة.

بشكل عام، يمكن استخدام الثوابت const لتعريف القيم الثابتة التي لا يمكن تغييرها، ويمكن الاستفادة منها في تحسين الأداء وتحسين قراءة وفهم الكود وتقليل الأخطاء وتسهيل عملية الصيانة.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...