في JavaScript، Destructuring تعني “تفكيك” المصفوفات (أو الكائنات) إلى متغيرات فردية بطريقة مختصرة وسهلة القراءة.
✅ الفكرة العامة:
تخيل أنك تملك مصفوفة وتريد استخراج عناصرها في متغيرات مستقلة، بدل استخدام array[0]
, array[1]
، يمكنك استخدام Destructuring.
✅ لماذا نستخدم Destructuring؟
- ** لكتابة كود أقل وأنظف
- ** لتسهيل قراءة البيانات والوصول إليها
- ** لإنشاء دوال مرنة وقابلة لإعادة الاستخدام
- ** لتفكيك استجابات واجهات البرمجة (APIs) أو القيم المُعادة من الدوال بسهولة
- ** لاستخراج أجزاء محددة من المصفوفات أو الكائنات دون الحاجة إلى الفهارس اليدوية
🧠 الصيغة العامة:
const [var1, var2, var3] = array;
JavaScript🟢 أمثلة على Destructuring Arrays
1. الأساسيات:
const colors = ['red', 'green', 'blue'];
const [firstColor, secondColor, thirdColor] = colors;
console.log(firstColor); // red
console.log(secondColor); // green
console.log(thirdColor); // blue
JavaScriptconst numbers = [10, 20];
const [a, b] = numbers;
console.log(a); // 10
console.log(b); // 20
JavaScriptconst colors = ['red', 'green', 'blue'];
const [first, second] = colors;
console.log(first); // red
console.log(second); // green
JavaScriptconst userData = ['Yasin', 'Programmer', 'Egypt'];
const [name, job, country] = userData;
console.log(`Name: ${name}, Job: ${job}, Country: ${country}`);
JavaScript2- تخطي عناصر في المصفوفة:
const numbers = [1, 2, 3, 4];
const [first, , third] = numbers;
console.log(first); // 1
console.log(third); // 3
JavaScriptconst letters = ['A', 'B', 'C', 'D'];
const [, , , last] = letters;
console.log(last); // D
JavaScript3- استخدام قيمة افتراضية (Default Value):
const fruits = ['apple'];
const [firstFruit, secondFruit = 'banana'] = fruits;
console.log(firstFruit); // apple
console.log(secondFruit); // banana (لأنه لم يتم تحديد عنصر ثاني)
JavaScriptconst [a = 5, b = 10] = [undefined];
console.log(a); // 5
console.log(b); // 10
JavaScriptconst [x = 'default', y = 'fallback'] = ['real'];
console.log(x); // real
console.log(y); // fallback
JavaScript4- التبديل بين متغيرين باستخدام Destructuring:
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a); // 20
console.log(b); // 10
JavaScriptlet a = 1, b = 2;
[a, b] = [b, a];
console.log(a); // 2
console.log(b); // 1
JavaScriptlet x = 'left', y = 'right';
[x, y] = [y, x];
console.log(x); // right
console.log(y); // left
JavaScript5- استخدام Rest Operator لجمع باقي العناصر:
const names = ['Ali', 'Omar', 'Sami', 'Yasin'];
const [first, ...rest] = names;
console.log(first); // Ali
console.log(rest); // ['Omar', 'Sami', 'Yasin']
JavaScript🔍 هذا يسمى:
Direct destructuring assignment
أو التفكيك المباشر من قيمة فورية (inline value)
🧠 لماذا نستخدم التفكيك بدون اسم أحيانًا؟
لأننا:
- لا نحتاج إلى المصفوفة الأصلية.
- نريد فقط التقاط بعض العناصر منها بشكل مباشر.
- نوفر سطر كود إضافي.
const [first, ...rest] = [1, 2, 3, 4];
console.log(first); // 1
console.log(rest); // [2, 3, 4]
JavaScriptconst [lang1, lang2, ...otherLangs] = ['HTML', 'CSS', 'JS', 'PHP', 'Python'];
console.log(otherLangs); // ['JS', 'PHP', 'Python']
JavaScript💡 استخدامات عملية:
- تخطي بعض العناصر الأولى في قائمة.
- فصل عنصر رئيسي عن باقي القائمة.
- معالجة أول عنصر بشكل خاص والباقي بشكل جماعي.
6- Destructuring داخل دالة:
function printNames(arr) {
const first = arr[0];
const second = arr[1];
console.log(first, second);
}
//////////////////////
function printNames([first, second]) {
console.log('First:', first);
console.log('Second:', second);
}
printNames(['Ahmed', 'Sara']);
JavaScriptconst [first, ...rest] = [1, 2, 3, 4];
console.log(first); // 1
console.log(rest); // [2, 3, 4]
JavaScriptconst [lang1, lang2, ...otherLangs] = ['HTML', 'CSS', 'JS', 'PHP', 'Python'];
console.log(otherLangs); // ['JS', 'PHP', 'Python']
JavaScript7- استخدام Destructuring مع التكرار:
✨ لماذا التفكيك مهم في الحلقات؟
- يبسط قراءة البيانات المكررة.
- يتفادى استخدام الفهارس مثل
arr[i][0]
. - يوضح نية المطوّر ويجعل الكود سهل الفهم.
- يدعم القيم الافتراضية و
...rest
.
const points = [[1, 2], [3, 4], [5, 6]];
for (const [x, y] of points) {
console.log(`X: ${x}, Y: ${y}`);
}
JavaScriptconst entries = ['a', 'b', 'c'];
for (const [index, value] of entries.entries()) {
console.log(index, value);
}
JavaScriptconst pairs = [[1, 2], [3, 4], [5, 6]];
for (const [x, y] of pairs) {
console.log(x + y);
}
JavaScript8. تفكيك متداخل (Nested Destructuring)
const data = [[1, 2], [3, 4]];
const [[a1, b1], [a2, b2]] = data;
console.log(a1, b1, a2, b2); // 1 2 3 4
JavaScriptconst users = [['Yasin', 25], ['Ali', 30]];
const [[name1, age1], [name2, age2]] = users;
console.log(name1, age2); // Yasin 30
JavaScript9. الإرجاع من دالة (Destructuring Return Values)
function getCoords() {
return [5, 10];
}
const [x, y] = getCoords();
console.log(x, y); // 5 10
JavaScriptfunction splitName(fullName) {
return fullName.split(' ');
}
const [first, last] = splitName('Yasin Ahmed');
console.log(first); // Yasin
console.log(last); // Ahmed
JavaScript10- مع قيم افتراضية في معاملات الدوال (Default Parameters)
function draw([x = 0, y = 0] = []) {
console.log(`x: ${x}, y: ${y}`);
}
draw(); // x: 0, y: 0
draw([5]); // x: 5, y: 0
JavaScriptfunction init([lang = 'JavaScript', level = 'Beginner'] = []) {
console.log(`${lang} - ${level}`);
}
init(); // JavaScript - Beginner
init(['Python']); // Python - Beginner
init(['HTML', 'Pro']); // HTML - Pro
JavaScript❗ملاحظات مهمة:
- Destructuring يعمل فقط مع iterables مثل arrays و strings.
- يمكنك استخدامه مع functions، loops، و default parameters.
- يمكن استخدامه داخل كائنات أيضًا (لكن هذا موضوع مختلف: destructuring objects)