প্রথমত, অ্যারের উপরে গণনা করতে কখনইfor in
লুপ ব্যবহার করবেন না । কখনও। পুরানো ভাল ব্যবহার করুন for(var i = 0; i<arr.length; i++)
।
এর পিছনে কারণগুলি নিম্নরূপ: জাভাস্ক্রিপ্টের প্রতিটি বস্তুর একটি বিশেষ ক্ষেত্র বলা হয় prototype
। আপনি যে ক্ষেত্রে সমস্ত কিছু যুক্ত করেন তা সেই ধরণের প্রতিটি বস্তুর অ্যাক্সেসযোগ্য হতে চলেছে। মনে করুন আপনি সমস্ত অ্যারেতে একটি শীতল নতুন ফাংশন রাখতে চান যা filter_0
শূন্যগুলি ফিল্টার করবে।
Array.prototype.filter_0 = function() {
var res = [];
for (var i = 0; i < this.length; i++) {
if (this[i] != 0) {
res.push(this[i]);
}
}
return res;
};
console.log([0, 5, 0, 3, 0, 1, 0].filter_0());
//prints [5,3,1]
এটি অবজেক্টগুলি প্রসারিত এবং নতুন পদ্ধতি যুক্ত করার একটি স্ট্যান্ডার্ড উপায়। প্রচুর গ্রন্থাগার এটি করে। যাইহোক, for in
এখন কীভাবে কাজ করে তা দেখুন :
var listeners = ["a", "b", "c"];
for (o in listeners) {
console.log(o);
}
//prints:
// 0
// 1
// 2
// filter_0
তুমি কি দেখছ? এটি হঠাৎ করেই মনে করে যে ফিল্টারটি আর একটি সূচি সূচক। অবশ্যই, এটি আসলে একটি সংখ্যাসূচক সূচক নয়, তবে for in
অবজেক্ট ফিল্ডগুলির মাধ্যমে অঙ্ক করা হবে, কেবল সংখ্যা সূচকগুলি নয়। সুতরাং আমরা এখন প্রতিটি সংখ্যার সূচক এবং মাধ্যমে গণনা করছি filter_0
। তবে filter_0
কোনও নির্দিষ্ট অ্যারে অবজেক্টের ক্ষেত্র নয়, প্রতিটি অ্যারে অবজেক্টের এখন এই সম্পত্তি রয়েছে।
ভাগ্যক্রমে, সমস্ত অবজেক্টের একটি hasOwnProperty
পদ্ধতি রয়েছে যা যাচাই করে যে এই ক্ষেত্রটি সত্যিকার অর্থে অবজেক্টের অন্তর্ভুক্ত কিনা বা এটি কেবল প্রোটোটাইপ শৃঙ্খল থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং এটি সেই ধরণের সমস্ত বস্তুর অন্তর্ভুক্ত।
for (o in listeners) {
if (listeners.hasOwnProperty(o)) {
console.log(o);
}
}
//prints:
// 0
// 1
// 2
দ্রষ্টব্য, যদিও এই কোডটি অ্যারেগুলির প্রত্যাশার মতো কাজ করে, আপনার কখনই, কখনই , ব্যবহার for in
এবং for each in
অ্যারে ব্যবহার করা উচিত নয় । মনে রাখবেন যে for in
অ্যারে সূচি বা মানগুলি নয়, কোনও অবজেক্টের ক্ষেত্রগুলি গণনা করে।
var listeners = ["a", "b", "c"];
listeners.happy = "Happy debugging";
for (o in listeners) {
if (listeners.hasOwnProperty(o)) {
console.log(o);
}
}
//prints:
// 0
// 1
// 2
// happy
if (evtListeners.hasOwnProperty(ind))
কেবলমাত্র (অ-উত্তরাধিকারসূত্রে) বৈশিষ্ট্যগুলির মধ্যে প্রসেসিং সীমাবদ্ধ করতে আবৃত থাকে । তবুও, কিছু ক্ষেত্রে আপনি উত্তরাধিকার সূত্রে প্রাপ্ত সমস্ত সম্পত্তি সহ সত্যই পুনরাবৃত্তি করতে চান। সেক্ষেত্রে, জেএসলিন্ট আপনাকে কোন বৈশিষ্ট্যটি চান তা স্থির করতে যদি একটি বিবৃতিতে লুপের দেহটি মোড়তে বাধ্য করে। এটি কাজ করবে এবং জেस्্লিন্টকে খুশি করবে:if (evtListeners[ind] !== undefined)