PDA

View Full Version : سوال: شمارنده در حلقه ی for ..in



lady64
شنبه 24 تیر 1391, 09:03 صبح
متغیر n در مثال زیر خودش افزایش پیدا میکنه ؟ اینکه n=0 باشه یا نه تاثیری در روند اجرا نداره . قرار دادنش در این مثال برای چیه ؟

function forin()
{

var n = 0 ;
var i = 1 ;
var Lessons = new Array( 5 ) ;
Lessons[0] = "HTML" ;
Lessons[1] = "CSS" ;
Lessons[2] = "Visual Basic" ;
Lessons[3] = "Java Script" ;
Lessons[4] = "ASP.NET" ;
for ( n in Lessons )
{
document.write ( "Lesson " + i + " = " + Lessons [n] + "<br / >") ;
i++ ;
}
}

mehdi.mousavi
شنبه 24 تیر 1391, 12:09 عصر
سلام.
مطلبی که میخوام بگم مطلب بسیار مهمی هستش، بنابراین بدقت بخونید و اگر لازمه اونو چند بار بخونید!
for...in در JavaScript، در حقیقت بین enumerable property name های یک Object، لوپ میزنه. یعنی چی؟ کد زیر رو در نظر بگیرید:

var Lessons = new Array(5);
Lessons[0] = 'HTML';
Lessons[1] = 'CSS';
Lessons[2] = 'Visual Basic';
Lessons[3] = 'Java Script';
Lessons[4] = 'ASP.NET';
Lessons.Test = 'My Test';

for (var n in Lessons) {
console.log(n);
}


خروجی این کد، اینه:


0
1
2
3
4
Test

بنابراین همونطوریکه می بینید، n شمارنده یا Index حلقه نیست! پس Lessons[0] چطوری Index اول اون آرایه رو برمیگردونه؟ مثال زیر رو در نظر بگیرید:


var Lessons = new Array(5);
Lessons[0] = 'HTML';
Lessons[1] = 'CSS';
Lessons[2] = 'Visual Basic';
Lessons[3] = 'Java Script';
Lessons[4] = 'ASP.NET';
Lessons.Test = 'My Test';

console.log(Lessons['Test']);


خروجی این کد My Test هستش. وقتی ما

console.log(Lessons[0]);

رو می نویسیم، Engine مربوطه پشت پرده، 0 رو به '0' (یعنی یک رشته) تبدیل می کنه و بهمین دلیل هستش که عموم مواقع از این موضوع جون سالم به در میبریم و بر این گمانیم که داریم با Index به اون آرایه دسترسی پیدا می کنیم. بنابراین بعنوان یک قانون کلی، استفاده از for...in برای iterate کردن آرایه ها کار مناسبی نیست، بخصوص در Enterprise Level Application ها که ممکنه در طول زمان، Property های متنوعی به Object ها اضافه بشه و استفاده از for...in باعث میشه تا اون property ها نیز در iterate کردن enumerable property name های اون آرایه دیده بشه (مگه اینکه با hasOwnProperty مطمئن بشیم که اون index متعلق به آرایه ماست و دقیقا بیانگر یک عدد هستش).

روش صحیح، استفاده از for های عادی است:

var Lessons = new Array(5);
Lessons[0] = 'HTML';
Lessons[1] = 'CSS';
Lessons[2] = 'Visual Basic';
Lessons[3] = 'Java Script';
Lessons[4] = 'ASP.NET';
Lessons.Test = 'My Test';

for (var index = 0; index < Lessons.length; index++ ) {
console.log(Lessons[index]);
}


بدین ترتیب اینجا دیگه Test Property دیده نمیشه و index ها لزوما به ترتیب، iterate خواهند شد (مساله ترتیب / عدم ترتیب در index ها بحث مهم دیگه ای در for...in هستش). اما در ECMAScript 5، می تونیم از forEach نیز استفاده کنیم:

var Lessons = new Array(5);
Lessons[0] = 'HTML';
Lessons[1] = 'CSS';
Lessons[2] = 'Visual Basic';
Lessons[3] = 'Java Script';
Lessons[4] = 'ASP.NET';
Lessons.Test = 'My Test';

Lessons.forEach(function (val, idx) {
console.log(val);
});


در نهایت، تعریف آرایه به اون شکل کار صحیحی نیست. بهتره از این Syntax برای تعریف آرایه استفاده کنید:

var lessons = ['HTML', 'CSS', 'Visual Basic', 'Java Script', 'ASP.NET'];
lessons.forEach(function (val, idx) {
console.log(val);
});


همینطور دقت کنید که نام متغیر ها، باید با حروف کوچک شروع بشه، چون بطور پیش فرض، Constructor Function ها رو با حرف بزرگ شروع می کنن. با ذکر همه این موارد، فقط یک مورد باقی می مونه، اونم اینکه سعی کنید از همون حلقه ساده for استفاده کنید، چون در حال حاضر browser های قدیمی، forEach رو Support نمیکنن.

موفق باشید.