English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تحليل دقيق لـ JS هل يتم التمرير بواسطة القيمة أم بواسطة الإشارة (موصى به)

نقل القيمة (call by value) هو الاستراتيجية الأكثر استخدامًا في التقييم: المعاملات الداخلية هي نسخة من المعاملات الفعلية عند الاستدعاء. لا يؤثر تعديل المعامل الداخلية على المعامل الفعلي.

  عند نقل القيمة (call by reference) يتلقى المعامل الداخلي تفضيلًا مظنه المحدد، وليس نسخة. هذا يعني أن إذا تم تعديل قيمة المعامل الداخلي، فإن القيمة الفعلية أيضًا ستتم تعديلها. ويشير كلاهما إلى نفس القيمة.

  نقل القيمة يمكن أن يجعل تتبع استدعاء الدوال أكثر صعوبة، ويمكن أن يؤدي أيضًا إلى بعض الأخطاء الدقيقة.

  نقل القيمة يتطلب كل مرة نسخًا جديدًا، مما يؤدي إلى أداء أقل لبعض الأنواع المعقدة. كل طريقة نقل القيمة لها مشاكلها.

  نوع الأساسيات في JS، يتم نقلها كقيمة.

var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a); // لا يزال 1, لم يتأثر بتعيين x = 2

  دعنا نرى كيف يتم نقل العناصر في الكائن:

var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, تم تعديلها! 
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // لا يزال 1، obj لم يتم تعديله إلى 100.

  من الواضح أن قيمة العنصر ليست تمرير بالمرجع. في الواقع، التمرير بالتبادل، أي أن الأنواع الأساسية في JS يتم تمريرها بالقيمة، والأنواع الديناميكية يتم تمريرها بالتبادل (تمرير بالمرجع، أو تمرير بالمرجع بالتبادل).

  النقطة الرئيسية لهذه الاستراتيجية هي: عند تمرير الم参数 إلى الدالة، تقوم الدالة باستقبال نسخة من مرجع الم参数 (ليس نسخة من الم参数 المتمرر بالقيمة، ولا مرجع مجهول التمرير). إنه يختلف عن التمرير بالمرجع في أن التمرير بالتبادل لا يؤثر على قيمة الم参数.

  بشكل عام، الأنواع الأساسية يتم تمريرها بطرق التمرير بالقيمة، بينما يتم تمرير الأنواع الديناميكية كمرجع إلى العنوان الذي يشير إليه، يمكن أيضًا اعتبارها نوعًا خاصًا من التمرير بالقيمة. إذا تم تعديل خصائص العنصر في الداخل، فهذا يعني تعديل خصائص العنصر الذي يشير إليه. ولكن، إذا تم تعديل العنصر ككل (مثل: o = 100 أو o = [])، فهذا يعني تعيين جديد للعنصر، وسيكون عنوان المرجع للم参数 هو عنوان المرجع للعنصر الجديد، وليس له أي علاقة بالعنصر الأصلي، لذا لن يؤثر على العنصر الأصلي.

ما ذكرته أعلاه هو كل المعرفة التي قدمها لك المحرر حول ما إذا كان JS يمر بطرق التمرير بالقيمة أم التمرير بالمرجع (موصى به)، آمل أن تكون مفيدة لك، إذا كان لديك أي استفسارات، فلا تتردد في ترك تعليق، وسأقوم بالرد على تعليقاتكم في أقرب وقت ممكن، وأشكركم أيضًا على دعمكم لموقع呐喊 لتعليم البرمجة!

بيان: محتوى هذا المقال تم جمعه من الإنترنت، يحق لصاحب الحقوق أن يأخذه، يتم جمع المحتوى من قبل المستخدمين على الإنترنت ويتم تحميله بشكل تلقائي، لا يمتلك هذا الموقع حقوق الملكية، لم يتم تعديل المحتوى بشكل إنساني، ولا يتحمل هذا الموقع أي مسؤولية قانونية ذات صلة. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال '#' بـ '@') لإبلاغنا، وقدم الدليل، وسنقوم بإزالة المحتوى المزعوم عن حقوق النسخ على الفور.

أنت قد تحب