السلام عليكم،
المرجوا المساعدة بالجواب عن سؤالي حول الجافاسكريبت:
ماهي افضل دالة للتكرار هل عبر استعمال For او Object.keys وماهي الاسرع وأين يكمن الاختلاف، بحث ولم اجد ما يشفي غليلي :/
المثال الأول : For Loop
for (var i=0; i<data.entry.length; i++) {
var thumbnail = data.entry[i].media.url,
title = data.entry[i].title,
summary = data.entry[i].summary,
author = data.entry[i].author[0].name,
comments = data.entry[i].thr;
};
المثال الثاني : Object.keys
Object.keys(data.entry).forEach(function(i){
var thumbnail = data.entry[i].media.url,
title = data.entry[i].title,
summary = data.entry[i].summary,
author = data.entry[i].author[0].name,
comments = data.entry[i].thr;
});
غالبا ما كنت استعمال ال For Loop ومؤخرا وضعت شرحا حوال ال JSON FEED API لكن هنالك شخص رأى الشرح ونصحني باستعمال Object.keys لانها اسرع بدل ال For، وفعلا جربتها لكن لم الاحظ اي اختلاف في السرعة وبحث حول الامر ولم اجد ما الفرق بينهما بالضبط فهل هنالك من يمكنه المساعدة؟
شيفرتك جيّدة جدًا وسريعة، فقط ملاحظات على الكتابة، يمكنك كتابة شيء مثل:
for (let i in data.entry) {
let entry = data.entry[i];
if (typeof entry.title == 'undefined') {
// عنصر غير صالح
// لا تستخدم الطريقة المختصر ; بعد العبارة ذاك سلوك سيء.
continue;
}
((entry) => {
var title = entry.title,
thumbnail = entry.media.url,
summary = entry.summary,
author = entry.author[0].name,
comments = entry.thr;
// your code here
})(entry);
}
الملاحظات:
- لا تعرف المتغير بشكل عمومي يكفي تعريفها في نطاق العبارة for، باستخدام let، لا فائدة من تعريفها في النطاق الأب إذا لن تستخدمها خارجًا.
var thumbnail, title, summary, author, comments, i;
- حتى ولو تعرف متغير العبارة عموميًا، يفضل أن تعرفه بداخل العبارة؛ كي يسهل الوصول إليه ومعرفة أين عُرِفَ.
for (i in data.entry) {
- أحسنت بالتأكد من أن المفتاح من داخل المصفوفة، المشكلة أن هذه العبارة ستكون دائمًا صحيحة حتى ولو كان المفتاح اسمًا -أصلًا في for in تكون كل المفاتيح نصوصًا typeof key === 'string' دائمًا- الحل الوحيد للتأكد هو التأكد من أنّ العنصر صحيح حقًا لديه مثلًا Title غير هذا قد تحدث مشكلة في بعض الحالات:
if (+i >= 0) {.
for (var i in data.entry[i]) {
if ((/\d+/).test(i)) {
(function (entry) {
var title = entry.title,
thumbnail = entry.media.url,
summary = entry.summary,
author = entry.author[0].name,
comments = entry.thr;
// your code here
})(data.entry[i]);
}
}
عندما أستخدم let في محرر brackets يعطي الخطأ
Expected an identifier and instead saw 'let'. let x = 7;
وعند استخدام var داخل for يعطي الخطأ
Move 'var' declarations to the top of the function. for (var i = 0; i < 10; i += 1) {
هل تقصد أنه لا يكفي للتأكد من أن i عدد صحيح ؟
أم تقصد أنه لا يكفي للتأكد من أن التدوينة لها عنوان ؟
الخطأ الثاني سببه أنّك تعرّف متغيّرًا بالكلمة var داخل حلقة for، بينما يفضل نقله لأعلى الدالة الّتي تحوي الحلقة، لأنّ المتغيّرات من نوع var نطاقها هو نطاق الدالة function-scoped وليس القطعة block-scoped، عمليًّا لن تجد فرقًا، ولكن فهمك لمجال المتغير سيساعدك في تجنب مشكلات غريبة قد لا تفهم سببها دون فهم طبيعة المجالات في JavaScript.
بارك الله فيكما لقد استفدت كثيرا من هذا النقاش البرمجي، بخصوص هذا الكود ماذا لو احد المتغيرات نتيجتها Undefined او Null هل سيعمل الكود بدون اي مشاكل؟
for (var i in data.entry[i]) {
if ((/^\d+$/).test(i)) {
(function (entry) {
var title = entry.title,
thumbnail = entry.media.url,
summary = entry.summary,
author = entry.author[0].name,
comments = entry.thr;
// التحقق من وجود عنوان ومحتوى للتدوينة
if (!title || !summary) {return; }
// your code here
})(data.entry[i]);
}
}
بارك الله فيك صديقي هل هذا يمكنني اضافة !thumbnail بخصوص لو المقالة ليست بها صورة يعني مجرد نصوصا ضمن المقالة هل سيشتغل الكود دون مشكلة؟
بعد أن اطلعت على ال Json المرسل من blooger رأيت أنه يجب إضافة المزيد من الشروط
أنظر هنا
أحب استخدام typeof دائمًا حتى أعتاد عليها؛ الطريقة الثانية سترجع خطأ في الوضع الصارم إذا كان متغير غير معرف -في الحالة السابقة لا فرق- لكن في شيفرتك لن تعمل، أبدًا؛ ستحصل على شيء مثل "Uncaught ReferenceError: x is not defined" إذا لم يكن x معرفًا.
التعليقات