सबसे पहले, एक सरणी पर गणना करने के लिए लूप का उपयोग कभी न करें 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
क्या तुम देखते हो? यह अचानक सोचता है कि फ़िल्टर_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))
केवल अपने (गैर-विरासत वाले) गुणों के लिए प्रसंस्करण को सीमित करने के लिए लपेटा जाता है। फिर भी, कुछ मामलों में आप वास्तव में विरासत में मिली संपत्ति सहित सभी संपत्तियों पर पुनरावृति करना चाहते हैं। उस स्थिति में, JSLint लूप बॉडी को एक स्टेटमेंट में लपेटने के लिए बाध्य करता है, ताकि यह तय किया जा सके कि आपको कौन से गुण चाहिए। यह काम करेगा और JSlint को खुश करेगा:if (evtListeners[ind] !== undefined)