أجبت اليوم على سؤال حول JavaScript ، والذي يتضمن مشكلات في المهمة ، لذلك أريد تلخيص هذه المشكلة بعناية.
نسخة الكود كما يلي:
var a = 'test' ؛
var b = function () {} ؛
ba = 'test' ؛
تغيير الوظيفة (م ، ن) {
م = "التغيير" ؛
na = 'التغيير' ؛
}
التغيير (أ ، ب) ؛
هل ستتغير قيم المتغيرات A و B بعد تنفيذ الكود أعلاه؟
القيم الأصلية والمرجعية
لقد قدمت القيمة الأصلية والقيمة المرجعية في المقالات السابقة. تشير القيمة الأصلية إلى غير محددة ، فارغة ، منطقية ، رقم ، سلسلة ، وما إلى ذلك ، والتي يتم تخزينها على المكدس ، بينما يتم دمج القيمة المرجعية من كائن ، والتي يتم تخزينها في الكومة.
هنا نحتاج إلى التمييز بين الاثنين:
نسخة الكود كما يلي:
var a = 'test' ؛
var b = سلسلة جديدة ('test') ؛
var a = 'true' ؛
var b = new Boolean ('true') ؛
بالنسبة للمتغيرات الأربعة أعلاه ، A و A هي القيم الأصلية ، في حين أن B و B هما القيم المرجعية.
آلية المهمة
بعد توضيح الفرق بين القيمة الأصلية والقيمة المرجعية ، يمكنك تقديم آلية تعيين JavaScript بالتفصيل:
في JavaScript ، ستقوم كل مهمة بإنشاء نسخة لمتغيرات نوع القيمة الأصلية ، وللقيم المرجعية ، كاسمها ، يتم تعيينه بالرجوع إلى ذاكرة كائن التخزين نفسه.
تعيين القيمة الأصلية:
نسخة الكود كما يلي:
var a = 1 ؛ // القيمة الأصلية
var b = a ؛ // قم بإنشاء نسخة إلى المتغير b
ب = 2 ؛ // لا تتعلق بـ
تنبيه (أ) ؛ // الإخراج 1
تعيين القيم المرجعية:
نسخة الكود كما يلي:
var a = new Object () ؛ // القيمة المرجعية
الفأس = 1 ؛
var b = a ؛ // التعيين المرجعي ، مشيرا إلى نفس الذاكرة
سيؤثر BX = 2 ؛ // تعديل B
تنبيه (AX) ؛ // الإخراج 2
مرور المعلمة
الآن دعونا نلقي نظرة على كيفية التعامل مع تمرير نوعين من القيم لتعمل معلمات في نفس الوقت.
1. تمرير القيمة الأصلية
نسخة الكود كما يلي:
var a = 1 ؛
اختبار الوظيفة (م) {
م = 2 ؛
}
اختبار (أ) ؛
تنبيه (أ) ؛ // الإخراج 1
الإخراج هو 1 ، لذلك نحن نعلم أن الوظيفة تمرر فقط قيمة المتغير في ، لذلك M في الوظيفة يحصل الجسم على القيمة 1 ويتم تعيينه إلى 2. هذه العملية لا تؤثر على المتغير الخارجي A.
2. تمرير القيمة المرجعية
نسخة الكود كما يلي:
var a = new Object () ؛
الفأس = 1
اختبار الوظيفة (م) {
MX = 2 ؛
}
اختبار (أ) ؛
تنبيه (AX) ؛ // الإخراج 2
الإخراج هو 2 ، لذلك نحن نعلم أن الوظيفة تمرر عنوان المتغير في ، لذلك M في جسم الوظيفة يحصل على عنوان تم تمريره. لذلك ، عندما يتم تعيين السمة X إلى 2 ، فإنها ستؤثر أيضًا على الإشارة إلى عنوان الذاكرة نفسه.
لخص
الآن دعنا نعود إلى السؤال الافتتاحي:
نسخة الكود كما يلي:
var a = 'test' ؛
var b = function () {} ؛
ba = 'test' ؛
تغيير الوظيفة (م ، ن) {
م = "التغيير" ؛
na = 'التغيير' ؛
}
التغيير (أ ، ب) ؛
المتغير A هو القيمة الأصلية ، والمتغير B هو القيمة المرجعية ، ويتم تمرير أحدهم في جسم الوظيفة كقيمة والآخر هو العنوان ، لذلك بعد تشغيل الوظيفة ، لن يتغير المتغير A ، وستتغير قيمة المتغير B.