تُعد طريقة تعامل جافا سكريبت مع تمرير المعلمات مصدرًا شائعًا للارتباك، وغالبًا ما يُناقش ما إذا كانت تمرير بالقيمة أو بالمرجع. والحقيقة أكثر دقة: تستخدم جافا سكريبت آلية تجمع بين جوانب كليهما، اعتمادًا تمامًا على نوع البيانات المعنية.
محتويات
- فهم تمرير بالقيمة مع الأنواع البدائية
- فهم تمرير بالمرجع مع الكائنات
- التوفيق بين تمرير بالقيمة وتمرير بالمرجع في جافا سكريبت
فهم تمرير بالقيمة مع الأنواع البدائية
تعمل أنواع البيانات البدائية في جافا سكريبت —number
، string
، boolean
، null
، undefined
، bigint
، وsymbol
— باستخدام تمرير بالقيمة. عندما يتم تمرير نوع بدائي إلى دالة، يتم إنشاء نسخة من قيمته و تمريرها. التعديلات داخل الدالة تؤثر فقط على هذه النسخة، تاركة المتغير الأصلي دون تغيير.
let x = 10;
function changeValue(y) {
y = 20;
}
changeValue(x);
console.log(x); // الإخراج: 10
في هذا المثال، تغيير y
داخل changeValue
لا يغير x
الأصلي.
فهم تمرير بالمرجع مع الكائنات
تتصرف الكائنات في جافا سكريبت (بما في ذلك المصفوفات والدوّال) بشكل مختلف. عندما يتم تمرير كائن إلى دالة، ما يتم تمريره هو مرجع — مؤشر إلى موقع ذاكرة الكائن. لذلك، أي تعديلات تُجرى على خصائص الكائن *داخل* الدالة تؤثر مباشرة على الكائن الأصلي.
let myArray = [1, 2, 3];
function modifyArray(arr) {
arr.push(4);
}
modifyArray(myArray);
console.log(myArray); // الإخراج: [1, 2, 3, 4]
هنا، تم تعديل myArray
لأن الدالة تُغيّر الكائن نفسه، وليس نسخة منه.
ومع ذلك، يوجد فرق مهم: إعادة تعيين المعلمة إلى كائن *جديد* داخل الدالة لا يغير الأصلي.
let myObject = { a: 1 };
function reassignObject(obj) {
obj = { a: 2 }; // تعيين كائن جديد
}
reassignObject(myObject);
console.log(myObject); // الإخراج: { a: 1 }
داخل reassignObject
، يشير obj
إلى كائن مختلف؛ يبقى myObject
الأصلي دون تغيير.
التوفيق بين تمرير بالقيمة وتمرير بالمرجع في جافا سكريبت
تمرير المعلمات في جافا سكريبت ليس أحدهما أو الآخر بشكل صارم. إنه نظام يعتمد على السياق:
- الأنواع البدائية: تمرير بالقيمة. يتم تمرير نسخة من القيمة؛ التغييرات الداخلية لا تؤثر على الأصلي.
- الكائنات: تمرير بالمرجع. يتم تمرير مرجع إلى الكائن؛ تؤثر التغييرات على خصائص الكائن على الأصلي. إعادة تعيين المعلمة إلى كائن جديد داخل الدالة تترك الأصلي دون تغيير.
إتقان هذا التمييز أمر بالغ الأهمية لكتابة كود جافا سكريبت قوي وقابل للتنبؤ. يعتمد السلوك كليًا على ما إذا كنت تعمل مع أنواع بدائية أو كائنات.