شرح التفكيك في JavaScript وعامل الانتشار مع أمثلة عملية

دقائق القراءة: 6

مقدمة إلى التفكيك وعامل الانتشار في JavaScript

توفّر لغة JavaScript أدوات حديثة تجعل كتابة الشيفرة أكثر وضوحاً واختصاراً. ومن أبرز هذه الأدوات ميزة Destructuring وعامل الانتشار Spread Operator. ورغم سهولة الفكرة، فإن استخدامهما بشكل صحيح يختصر كثيراً من الشيفرة المتكررة ويجعل التعامل مع المصفوفات والكائنات أكثر مرونة.

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

شرح التفكيك وعامل الانتشار في جافاسكربت مع أمثلة برمجية عملية

ما هو تفكيك المصفوفات في JavaScript؟

تفكيك المصفوفات هو أسلوب يتيح لك استخراج القيم من المصفوفة مباشرة إلى متغيرات، بدلاً من الوصول إلى كل عنصر عبر الفهرس باستخدام الصيغة التقليدية.

لنفترض أن لدينا المصفوفة التالية:

let array1 = [1, 2, 3, 4, 5];

بالطريقة التقليدية، يمكن الوصول إلى العناصر بهذا الشكل:

array1[0];
array1[1];
array1[2];
array1[3];
array1[4];

هذه الطريقة صحيحة، لكنها تصبح أقل أناقة كلما زاد عدد العناصر. أما باستخدام التفكيك، فيمكن كتابة الشيفرة بشكل أبسط:

let [indexOne, indexTwo, indexThree, indexFour, indexFive] = array1;

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

نتيجة تفكيك عناصر المصفوفة في جافاسكربت إلى متغيرات مستقلة

تخطي عناصر محددة أثناء التفكيك

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

let [indexOne, indexTwo, , indexFour, indexFive] = array1;

لاحظ أننا تجاهلنا العنصر الثالث من دون الحاجة إلى تخزينه في متغير.

let [indexOne, indexTwo, , indexFour, indexFive] = array1;

console.log(indexOne);
console.log(indexTwo);
console.log(indexFour);
console.log(indexFive);

هذه التقنية مفيدة جداً عندما تكون مهتماً بعناصر محددة فقط من المصفوفة.

تخطي عنصر داخل تفكيك المصفوفة في JavaScript أثناء طباعة النتائج

ما هو تفكيك الكائنات في JavaScript؟

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

لنأخذ المثال التالي:

let object = {
  name: "Nishant",
  age: 24,
  salary: 200,
  height: "20 meters",
  weight: "70 KG"
};

إذا أردنا طباعة بعض الخصائص بالطريقة المعتادة، فسنكتب:

console.log(object.name);
console.log(object.salary);
console.log(object.weight);

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

let { name, salary, weight } = object;

console.log(name);
console.log(salary);
console.log(weight);

هنا جرى استخراج القيم اعتماداً على أسماء المفاتيح داخل الكائن، وليس على ترتيبها.

استخدام تفكيك الكائنات لاستخراج الخصائص في جافاسكربت

تعيين قيم افتراضية عند غياب الخاصية

من المزايا المهمة في تفكيك الكائنات إمكانية تحديد قيمة افتراضية إذا كانت الخاصية غير موجودة. لنرَ المثال التالي:

let object = {
  name: "Nishant",
  age: 24,
  height: "20 meters",
  weight: "70 KG"
};

let { name, salary, weight } = object;

console.log(name);
console.log(salary);
console.log(weight);

بما أن الخاصية salary غير موجودة، فستكون قيمتها undefined.

ظهور قيمة undefined عند غياب خاصية أثناء تفكيك كائن في JavaScript

لحل هذه المشكلة، يمكن تعيين قيمة افتراضية مباشرة أثناء التفكيك:

let object = {
  name: "Nishant",
  age: 24,
  height: "20 meters",
  weight: "70 KG"
};

let { name, salary = 200, weight } = object;

console.log(name);
console.log(salary);
console.log(weight);

بهذا نحصل على القيمة 200 عندما لا تكون الخاصية salary موجودة في الكائن.

استخدام قيمة افتراضية مع تفكيك الكائنات في جافاسكربت

أما إذا كانت الخاصية موجودة بالفعل، فإن القيمة الفعلية هي التي تُستخدم، وليس القيمة الافتراضية:

let object = {
  name: "Nishant",
  age: 24,
  salary: 300,
  height: "20 meters",
  weight: "70 KG"
};

let { name, salary = 200, weight } = object;

console.log(name);
console.log(salary);
console.log(weight);

في هذه الحالة ستكون قيمة salary هي 300.

أولوية القيمة الفعلية على القيمة الافتراضية عند تفكيك كائن في JavaScript

استخدام تفكيك الكائنات داخل الدوال

يصبح التفكيك أكثر فائدة عند تمرير الكائنات إلى الدوال. فبدلاً من استقبال الكائن كاملاً ثم الوصول إلى خصائصه داخل جسم الدالة، يمكنك تفكيكه مباشرة في معاملات الدالة.

لنبدأ بهذا المثال:

let object = {
  name: "Nishant",
  age: 24,
  salary: 300,
  height: "20 meters",
  weight: "70 KG"
};

function printData() {
}

printData(object);

بالطريقة التقليدية قد نكتب:

let object = {
  name: "Nishant",
  age: 24,
  salary: 300,
  height: "20 meters",
  weight: "70 KG"
};

function printData(object) {
  console.log(object);
}

printData(object);

تمرير كائن إلى دالة في جافاسكربت بالطريقة التقليدية

لكن يمكن كتابة ذلك بصورة أكثر احترافية باستخدام التفكيك مباشرة داخل معاملات الدالة:

let object = {
  name: "Nishant",
  age: 24,
  salary: 300,
  height: "20 meters",
  weight: "70 KG"
};

function printData({ name, age, salary, height, weight }) {
  console.log(name, age, salary, height, weight);
}

printData(object);

هذا الأسلوب يوضّح منذ البداية ما هي البيانات التي تحتاجها الدالة فعلاً، ويقلل الاعتماد على الكائن الكامل داخلها.

تفكيك الكائنات مباشرة داخل معاملات الدوال في JavaScript

تفكيك القيم المعادة من الدوال

إذا كانت الدالة تعيد مصفوفة، فيمكنك تفكيك الناتج مباشرة إلى متغيرات واضحة الاسم، بدلاً من التعامل مع الفهارس يدوياً.

function sample(a, b) {
  return [a + b, a * b];
}

let example = sample(2, 5);
console.log(example);

الدالة السابقة تعيد مصفوفة تحتوي على ناتج الجمع ثم ناتج الضرب.

دالة تعيد مصفوفة تحتوي على ناتج الجمع والضرب في JavaScript

وبدل التعامل مع الناتج كمصفوفة، يمكننا استخدام التفكيك بالشكل التالي:

let [addition, multiplication] = sample(2, 5);

console.log(addition);
console.log(multiplication);

هذا يجعل الشيفرة أكثر تعبيراً، لأن اسم كل متغير يوضّح قيمته مباشرة.

تفكيك القيم المعادة من دالة إلى متغيرات واضحة في جافاسكربت

ما هو عامل الانتشار Spread Operator في JavaScript؟

عامل الانتشار يُكتب على هيئة ثلاث نقاط ...، وتكمن فكرته في توسيع عناصر المصفوفة أو خصائص الكائن داخل بنية جديدة. وهو من الأدوات الأساسية التي تجعل الشيفرة أقصر وأكثر مرونة.

يمكن استخدامه في عدة سيناريوهات شائعة، مثل:

  • دمج المصفوفات.
  • إدراج عناصر مصفوفة داخل مصفوفة أخرى.
  • دمج الكائنات.
  • نسخ المصفوفات والكائنات بطريقة مختصرة.

أمثلة عملية على عامل الانتشار

دمج مصفوفتين بسهولة

لنفترض أن لدينا مصفوفتين ونريد دمجهما:

let array1 = [1, 2, 3, 4, 5];
let array2 = [6, 7, 8, 9, 10];
let array3 = array1.concat(array2);

console.log(array3);

هذه الطريقة تعمل بشكل جيد، لكن Spread Operator يجعلها أبسط:

let array1 = [1, 2, 3, 4, 5];
let array2 = [6, 7, 8, 9, 10];
let array3 = [...array1, ...array2];

console.log(array3);

في هذا المثال، تم توسيع عناصر array1 وarray2 داخل مصفوفة جديدة.

دمج مصفوفتين باستخدام Spread Operator في JavaScript

إدراج مصفوفة داخل أخرى

من الاستخدامات المفيدة أيضاً إدراج عناصر مصفوفة داخل مصفوفة أخرى في موضع محدد:

let array1 = [1, 2, 3, 4, 5];
let array2 = [6, 7, ...array1, 8, 9, 10];

console.log(array2);

هنا جرى إدراج عناصر array1 بين 7 و8 داخل array2.

إدراج عناصر مصفوفة داخل مصفوفة أخرى باستخدام عامل الانتشار

دمج كائنين في كائن واحد

عامل الانتشار لا يقتصر على المصفوفات، بل يُستخدم أيضاً مع الكائنات:

let object1 = {
  firstName: "Nishant",
  age: 24,
  salary: 300,
};

let object2 = {
  lastName: "Kumar",
  height: "20 meters",
  weight: "70 KG"
};

لدمجهما، نكتب:

let object1 = {
  firstName: "Nishant",
  age: 24,
  salary: 300,
};

let object2 = {
  lastName: "Kumar",
  height: "20 meters",
  weight: "70 KG"
};

let object3 = { ...object1, ...object2 };
console.log(object3);

بهذا نحصل على كائن جديد يجمع خصائص الكائنين معاً.

دمج كائنين باستخدام Spread Operator في جافاسكربت

نسخ مصفوفة إلى أخرى

من التطبيقات الشائعة أيضاً إنشاء نسخة من مصفوفة موجودة:

let array1 = [1, 2, 3, 4, 5];
let array2 = [...array1];

console.log(array2);

هنا جرى إنشاء مصفوفة جديدة تحتوي على العناصر نفسها الموجودة في array1.

نسخ عناصر مصفوفة إلى مصفوفة جديدة باستخدام عامل الانتشار في JavaScript

متى تستخدم التفكيك وعامل الانتشار؟

لتحقيق أفضل استفادة من هاتين الميزتين، استخدمهما في الحالات التالية:

  • عندما تحتاج إلى استخراج قيم محددة من مصفوفة أو كائن بسرعة.
  • عندما تريد كتابة دوال تستقبل البيانات المطلوبة فقط بوضوح.
  • عندما تنشئ نسخاً جديدة من البيانات بدلاً من تعديل الأصل مباشرة.
  • عندما تحتاج إلى دمج بيانات متعددة بطريقة مختصرة وسهلة القراءة.

أفضل الممارسات عند الاستخدام

  1. استخدم أسماء متغيرات واضحة عند التفكيك حتى تظل الشيفرة مفهومة.
  2. استفد من القيم الافتراضية لتجنب ظهور undefined في النتائج غير المتوقعة.
  3. احذر عند نسخ البنى المتداخلة، لأن عامل الانتشار ينشئ نسخة سطحية shallow copy فقط.
  4. لا تُفرط في التفكيك إذا كان سيجعل السطر طويلاً أو أقل وضوحاً.

الخلاصة التقنية

يُعد كل من Destructuring وSpread Operator من أهم الأدوات الحديثة في JavaScript، لأنهما يرفعان جودة الشيفرة من حيث الوضوح والاختصار وسهولة الصيانة. من الناحية العملية، التفكيك مناسب لاستخراج القيم بسرعة، بينما يبرع عامل الانتشار في الدمج والنسخ وإعادة تشكيل البيانات. وإذا كنت تطوّر واجهات تفاعلية أو تتعامل مع بيانات كثيرة داخل التطبيقات الحديثة، فإن إتقان هاتين الميزتين سيوفّر عليك وقتاً كبيراً ويجعل شيفرتك أكثر احترافية.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *